GCC,G++如何将字符过长警告变为错误

fivyi3re  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(177)

我正在用C为Web服务后端编写一个庞大的代码库,我的前端是Javascript,所以我倾向于编写一些前端代码,然后回到C代码,更经常的是,我在某处编写了以下犯罪:container['myKey'],这通常会在某个地方导致崩溃,我使用了带缓存的编译热重载,这意味着如果我没有捕捉到编译器在第一次发生多字符串时抛出的警告,我将不会在下次编译中看到它(因为该单元可能不会重新编译)。
这是一个非常愚蠢的错误,给我的软件带来随机崩溃,有时我需要几个小时才能找到罪魁祸首并修复它。由于某种原因,编译器警告多字符串长度超过4个字符不能变成g ++中的错误(它没有警告代码,像其他警告一样。)这意味着我只能写一些东西放在我的CI/CD中,当发现多字符文字时会导致错误。
因此,我的想法是编写一个小bash脚本,它将检查所有. cpp文件中是否存在任何多字符常量,如果发现,则返回一个错误。
我试着写一个正则表达式来捕捉这些,但我失败了,如果你,一个正则表达式魔术师,能帮助我写一个正则表达式来捕捉"像这样的东西",但不是"像这样的东西"(对查询的调用("SELECT * FROM data WHERE data LIKE('potato ')")应该是有效的,我会非常高兴。
先谢了。
编辑:其他信息:按照评论中提出的解决方案,我尝试了-Werror = multichar,我发现了一些奇怪的东西,它只在少数情况下有效:

g++ -o obj/src/main.ocpp -c src/main.cpp -fno-trapping-math -Werror=multichar -O3 -std=c++17 -D_FORCE_INLINES -I./src/include -I/usr/include/mysql
src/main.cpp:52:11: error: multi-character character constant [-Werror=multichar]
   52 |   langAll['test'] = true;

因为如果单引号内的字符太多,则警告会发生变化:

g++ -o obj/src/main.ocpp -c src/main.cpp -fno-trapping-math -Werror=multichar -O3 -std=c++17 -D_FORCE_INLINES -I./src/include -I/usr/include/mysql
src/main.cpp:52:11: warning: character constant too long for its type
   52 |   langAll['testtttttt'] = true;

我发现代码中的GCC部分会脱口而出以下警告:https://github.com/gcc-mirror/gcc/blob/master/libcpp/charset.cc

if (type == CPP_UTF8CHAR)
    max_chars = 1;
  if (i > max_chars)
    {
      i = max_chars;
      cpp_error (pfile, type == CPP_UTF8CHAR ? CPP_DL_ERROR : CPP_DL_WARNING,
         "character constant too long for its type");
    }
  else if (i > 1 && CPP_OPTION (pfile, warn_multichar))
    cpp_warning (pfile, CPP_W_MULTICHAR, "multi-character character constant");

不知道如何打开这个:

CPP_DL_WARNING,"character constant too long for its type");

变成了一个错误。
在与chatgpt交谈后,它建议:- Woverlength-strings-Werror = overlength-strings,但是它也不能将警告变成错误。

cgvd09ve

cgvd09ve1#

由于没有人帮忙,我自己做了一个解决方案来解决这个问题(有点像短绒):https://github.com/Brasilibr/cppmultilinecharchecker这是一个cpp程序,你把一个文件夹作为第一个参数传递给它,它将验证该文件夹下的每个文件(以及递归地验证所有文件夹)。它将检查任何超过4个字符的多字节字符,如果找到则返回0,如果所有文件都没问题则返回1。你可以使用run.sh在任何基于Debian的Linux或ubuntu WSL上运行它。

相关问题