我使用带有 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 终止字符串的最佳做法是什么?
最佳答案
审计工具发出警告,调用 strlen
将继续读取字节,直到找到零字节。如果 machineMarket
的内容不包含零,则 strlen 可能会继续读取合法内存的末尾并导致访问冲突。
你说你是这样声明变量的
char machineMarket[VALUE_MARKET_MAX_LEN + 1];
所以你可以使用strnlen
函数来确保你永远不会读得太远,或者使用@Zan Lynx 的方法在最后强制插入一个0。
无论使用哪种方法,您都可能需要处理原始字符串终止/未终止的情况。
关于c - 此函数不能正确处理以非 NULL 结尾的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203332/