我发现Clang的文档很差.我找不到很多可用的Clang警告标志列表.我特别感兴趣的是C/C++警告,但这是一个普遍的问题.
GCC列出并描述了警告,并列出了-Wall和-Wextra中包含的内容:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options
Clang的-Wall和-Wextra包含哪些警告标志?
我可以为每个版本搜索Clang发行说明,以查看每次引入的新警告标记(例如http://llvm.org/releases/3.4/tools/clang/docs/ReleaseNotes.html),但是更容易列表和/或描述Clang的警告?这将非常有用.我需要知道-Wall包含哪些内容,哪些不包含,所以我可以考虑启用那些不包含的内容.
(我知道 - 对于Clang来说存在一切 - 我可能不得不求助于使用它而只是明确禁用我不喜欢的那些吗?更多文档会使这更理想.)
我在Ubuntu 12.10上运行Clang 3.4(来自http://llvm.org/apt/).我在一些代码上运行了分析器(clang --analyze),它发现了一些问题:
Blah.C:429:9: warning: Declared variable-length array (VLA) has zero size
unsigned char separatedData[groupDataLength];
^~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
但具体问题并不重要.我想知道它是如何得出这个结论的步骤(代码很复杂,我不能在15分钟内看到它).
我看到Clang网站的截图,显示了在网络浏览器中查看的工作步骤:

这可能是从Xcode获得的.
问题是:如何让Clang从命令行输出这些工作步骤?如果愿意,甚至可以将结果输出到浏览器?这将使分析仪显着更有用,并使修复更快.
(我注意到GCC的文档非常优秀,但Clang/LLVM的文档很差.我已经尝试过"clang --analyze -Xanalyzer'-v'"作为黑暗中的刺,告诉分析仪更详细 - -Xanalyzer开关来自手册页.)
阅读了 Meson 站点页面(通常是高质量的)后,我仍然不确定处理不同构建类型的不同选项的预期最佳实践。
因此,要指定调试版本:
meson [srcdir] --buildtype=debug
Run Code Online (Sandbox Code Playgroud)
或者指定发布版本:
meson [srcdir] --buildtype=release
Run Code Online (Sandbox Code Playgroud)
但是,如果我只想b_sanitize=address为调试版本和b_ndebug=true发布版本添加(或其他任意复杂的参数集),我会这样做:
meson [srcdir] --buildtype=debug -Db_sanitize=address ...
meson [srcdir] --buildtype=release -Db_ndebug=true ...
Run Code Online (Sandbox Code Playgroud)
然而,在命令行上添加一堆自定义参数更麻烦,对我来说,把它放在 meson.build 文件中似乎更简洁。所以我知道我可以这样设置一些内置选项:
project('myproject', ['cpp'],
default_options : ['cpp_std=c++14',
'b_ndebug=true'])
Run Code Online (Sandbox Code Playgroud)
但它们是无条件设置的。
所以一个条件看起来像这样:
if get_option('buildtype').startswith('release')
add_project_arguments('-DNDEBUG', language : ['cpp'])
endif
Run Code Online (Sandbox Code Playgroud)
这是一种方法,但是,似乎b_ndebug=true更喜欢这种方法add_project_arguments('-DNDEBUG'),因为它是可移植的。
如何在 Meson 脚本中有条件地设置可移植样式的构建选项?
另外,b_sanitize=address设置没有任何测试编译器是否支持它。我希望它首先检查它是否受支持(例如,因为库可能丢失):
if meson.get_compiler('cpp').has_link_argument('-fsanitize=address')
add_project_arguments('-fsanitize=address', language : ['cpp'])
add_project_link_arguments('-fsanitize=address', language : ['cpp'])
endif
Run Code Online (Sandbox Code Playgroud)
是否可以检查内置的便携式构建选项(例如b_sanitize)是否受支持?
当TCP链路的一端断开连接时,它会向另一端发送重置(RST)消息.我希望能够在应用程序层中收到此信息.
在我的代码中,我使用一个select()调用来接收来自潜在多个源的输入,包括TCP连接.我已经看到,当select()显示有数据准备好在连接上读取,然后一个read()调用返回0字节读取,这发生在通过TCP发送RST之后.(我理解的recv()作品类似于read().)
是否read()返回0字节(后select()一个TCP连接上)只有当连接被重置?在任何其他情况下它是否会返回0字节?
我记得前一段时间在连接的另一端使用了一个特定的以太网设备,而这个Linux端在接收到0之后接收0字节select(),但不是用于连接重置,而是在某些数据流中途.我在Wireshark中确认收到的数据包有0个数据字节.这是一个错误,或者像上面的问题一样,这种行为是否有效?我不记得它是哪个设备,因为它是几年前,但它使用的是Windows驱动程序.