C strchr在HPUX上使用NULL值,但在RHEL上使用segfaults

我将一些代码从HPUX 11.11迁移到RHEL 7.5,其中包括一个使用strchr的函数。在HPUX上运行良好,在RHEL上存在分段错误。我隔离了代码,并创建了以下简单测试以及后续结果。找不到字符时,HPUX strchr似乎返回空字符串而不是NULL。这不是手册页所说的。我发现它可能不是strchr函数,而是HPUX处理NULL值的方式的不同,或从cc到gcc的编译器的不同。有人真的知道这里发生了什么吗?为什么在HPUX上代码无法分段?

C代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[]) {
    int i = 0;
    char* phrase = "Here is my phrase.";
    while (i < 5){
        phrase = strchr(phrase,' ');
        ++phrase;

        ++i;
    }
    return 0;
}

HPUX Makefile:

BIN=/path/to/bin/
CflaGS=-c

#----------Targets----------#
default: $(BIN)strchrtest

#----------Objects----------#
OBJS = strchrtest.o

#----------------BUILD----------------#
$(BIN)strchrtest: $(OBJS) 
    cc -o $@ $(OBJS) 

strchrtest.o: strchrtest.c
    cc $(CflaGS) strchrtest.c

RHEL生成文件:

CC=gcc
BIN=/path/to/bin/
CflaGS=-c -g -Wall

#----------Targets----------#
default: $(BIN)strchrtest

#----------Objects----------#
OBJS = strchrtest.o

#----------------BUILD----------------#
$(BIN)strchrtest: $(OBJS) 
    $(CC) -o $@ $(OBJS) 

strchrtest.o: strchrtest.c
    $(CC) $(CflaGS) strchrtest.c

HPUX只是一个成功的结果。没有分割错误。

RHEL结果:

(gdb) run
Starting program: ../strchrtest

Program received signal SIGSEGV,Segmentation fault.
0x00007ffff7b4c5f4 in __strchr_sse42 () from /lib64/libc.so.6

复制下面的评论:重点是,当要求strchr函数本身在空指针中找到一个字符(已递增)时,它会导致段错误,但在HPUX上则不会。因此,它要么返回一个空字符串,然后在下一个循环将其传递给strchr,要么strchr通过不进行段错误处理以不同方式处理null指针参数。否则我会误会正在发生的事情。

zoujitao 回答:C strchr在HPUX上使用NULL值,但在RHEL上使用segfaults

这样制作两个文件r.c,main.c r.c:

int *r = 0;

main.c:

extern int *r;
int main(void) {
     return *r;
}

然后cc main.c r.c; ./a.out 如果不是sigsegv,则您的运行时正在为您映射一个null页。 您可以自己完成-main.c:

#include <sys/mman.h>
int main(void) {
    p = mmap(0,1,PROT_READ,MAP_ANON|MAP_PRIVATE|MAP_FIXED,-1,0);
    if (p == MAP_FAILED) {
        perror("mmap");
        exit(1);
    }
     ....
}

但至少在ubuntu上,您需要是root:(

本文链接:https://www.f2er.com/3149908.html

大家都在问