此函数不能正确处理以非 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 未终止的情况。
我 运行 使用带有 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 未终止的情况。