此函数不能正确处理以非 NULL 结尾的字符串

This function does not properly handle non-NULL terminated strings

我 运行 使用带有 sonar.cxx 插件的 SonarCube 对我的嵌入式 C 代码进行代码分析。

我还用 sonarcube 解析用 Rough Auditing Tool for Security (RATS) 生成的 XML,我得到这个错误:

This function does not properly handle non-NULL terminated strings. This does not result in exploitable code, but can lead to access violations.

这是生成上述错误的代码:

  if( (machineMarket == NULL) || (strlen(machineMarket) > VALUE_MARKET_MAX_LEN) )

处理非 NULL 终止字符串的最佳做法是什么?

如果您拥有的从 machineMarket 开始的连续内存块没有 [=11=],那么您的代码的行为是未定义的。

改用strnlen,传递顺序为VALUE_MARKET_MAX_LEN的东西作为参数,然后重构你的>

我处理它的方式是每当我从我的模块外部、网络读取或对我的库的调用中获取一个字符串时,我都会在它的末尾设置一个 0。现在,无论如何,它都是一个有效的 C 字符串。

因此,如果我的库函数接受 int func(char *output, size_t output_len),那么在我将它用于任何事情之前,我总是首先使用 if( !output || !output_len) return; 进行验证,然后使用 output[output_len-1] = 0;

那么即使他们传给我完全是垃圾,它至少是一个有效的字符串。

审计工具发出警告,调用 strlen 将继续读取字节,直到找到零字节。如果 machineMarket 的内容不包含零,则 strlen 可能会继续读取合法内存的末尾并导致访问冲突。

你说你是这样声明变量的
char machineMarket[VALUE_MARKET_MAX_LEN + 1];
所以你可以使用strnlen函数来确保你永远不会读得太远,或者使用@Zan Lynx的方法在最后强制插入一个0。

无论使用哪种方法,您都可能需要处理原始字符串 is/was 未终止的情况。