我将一些代码从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指针参数。否则我会误会正在发生的事情。