【问题标题】:Invalid read size of 1 strcmp1 strcmp 的读取大小无效
【发布时间】:2019-12-14 11:46:40
【问题描述】:

我正在尝试比较两个名称字符串以返回匹配的结构。我已经使用 gdb 验证了传递给 strcmp() 的两个参数在 GDB 中都是非空的。但是,当我点击 strcmp() 调用时,程序会出现段错误。

valgrind 的输出是:

==5563== Invalid read of size 1
==5563==    at 0x483EED7: strcmp (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==5563==    by 0x10AF1B: cecs_component (cecs_component.c:74)

段错误后gdb的输出是:

Program received signal SIGSEGV, Segmentation fault.
__strcmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:102
102     ../sysdeps/x86_64/multiarch/strcmp-avx2.S: No such file or directory.

这两种情况都会让我相信我已经将 NULL 值传递给 strcmp(),但是如果我使用 GDB 检查在段错误之前传递的参数的值,它们看起来都是有效的:

Breakpoint 1, cecs_component (cecs=0x55555555f100, name=0x55555555a5c8 "position") at src/cecs_component.c:74
74                      if(strcmp(name, cecs->components[i].name == 0)){
(gdb) p cecs->components[i]
$1 = {data = 0x55555555fdd0, size = 12, key = 128, name = 0x55555555a5c8 "position"}

有问题的sn-p如下:

for(int i = 0; i < cecs->num_components; ++i){
        if(strcmp(name, cecs->components[i].name == 0)){
                return &cecs->components[i];
        }
}
return NULL;

sn-p 是从 libcheck 单元测试中运行的,但是在 CK_FORK 环境变量设置为“no”的情况下 & 会发生段错误,因此我认为该错误不是 libcheck 特定的。

任何帮助将不胜感激

【问题讨论】:

    标签: c gdb valgrind strcmp


    【解决方案1】:

    有错别字

    if(strcmp(name, cecs->components[i].name == 0)){
    

    我想你是说

    if(strcmp(name, cecs->components[i].name ) == 0){
    

    【讨论】:

    • 是的,就是这样!真的需要第二双眼睛,干杯:)
    猜你喜欢
    • 2012-07-21
    • 2014-04-19
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2020-09-30
    • 2014-11-30
    相关资源
    最近更新 更多