From be95afe1968b43ccc9e3f267b12043a62f3f0595 Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Sat, 25 Mar 2023 12:34:35 +0900 Subject: [PATCH] lib/clippy: bail out on newline inside string While C compilers will generally process strings across lines, we really don't want that. I rather treat this as the indication of the typo it probably is warn about it than support this odd C edge case. Signed-off-by: David Lamparter --- lib/defun_lex.l | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/defun_lex.l b/lib/defun_lex.l index 81ae497cf1..124f864166 100644 --- a/lib/defun_lex.l +++ b/lib/defun_lex.l @@ -53,6 +53,7 @@ int comment_link; char string_end; char *value; +static const char *yyfilename; static void extendbuf(char **what, const char *arg) { @@ -119,8 +120,17 @@ SPECIAL [(),] } } \\\n /* ignore */ +\n { + fprintf(stderr, + "%s:%d: string continues past the end of the line\n", + yyfilename, yylineno); + free(value); + value = NULL; + BEGIN(INITIAL); + return STRING; + } \\. extend(yytext); -[^\\\"\']+ extend(yytext); +[^\\\"\'\n]+ extend(yytext); "DEFUN" value = strdup(yytext); return DEFUNNY; "DEFUN_NOSH" value = strdup(yytext); return DEFUNNY; @@ -235,6 +245,7 @@ PyObject *clippy_parse(PyObject *self, PyObject *args) int token; yyin = fd; value = NULL; + yyfilename = filename; PyObject *pyCont = PyDict_New(); PyObject *pyObj = PyList_New(0); @@ -252,6 +263,7 @@ PyObject *clippy_parse(PyObject *self, PyObject *args) if (!pyArgs) { free(tval); Py_DECREF(pyCont); + yyfilename = NULL; return NULL; } pyItem = PyDict_New(); @@ -280,5 +292,6 @@ PyObject *clippy_parse(PyObject *self, PyObject *args) } def_yylex_destroy(); fclose(fd); + yyfilename = NULL; return pyCont; }