﻿# V1097\. Line splice results in a character sequence that matches the syntax of a universal\-character\-name\. Using this sequence lead to undefined behavior\.

Анализатор обнаружил перенос линии исходного кода \(символ '\\' в конце строки\), который при помощи синтаксиса universal\-character\-name образует символ Unicode\. Согласно стандарту, такой код приводит к неопределённому поведению\.

Пример:

```cpp
void error()
{
  auto p = "\\
u0041"; // maybe const char[2] "A" ?
}
```

В указатель 'p' присваивается строковый литерал, который при помощи последовательности \\u0041, образует символ заглавной латинской 'A'\. При этом между знаками '\\' и 'u' идёт перенос строки, который объединяется ещё одним символом '\\'\.

В результате [второй фазы](https://eel.is/c++draft/lex.phases#1.2) трансляции линии исходного кода, которые оканчиваются символом '\\', должны быть объединены в одну\. Это может применяться для повышения читаемости кода, если необходимо разбить на несколько строк макрос или длинный строковый литерал\. В результате объединения строки могут сформировать экранированные последовательности\. Однако стандарт явно декларирует появление неопределённого поведения, если таким образом формируется universal\-character\-name:


> Except for splices reverted in a raw string literal, if a splice results in a character sequence that matches the syntax of a \[universal\\\-character\\\-name\]\(https://eel\.is/c\+\+draft/lex\.charset\#nt:universal\-character\-name\), the behavior is undefined\\\.

Чтобы избежать такой ситуации, последовательность нужно полностью оставить на одной линии, или перенести на другую:

```cpp
void ok1()
{
  auto p = "\u0041"; // const char[2] "A"
}
void ok2()
{
  auto p = "\
\u0041";
}
```