我正在将一些代码从 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 生成文件:
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 通过不进行段错误以不同方式处理空指针参数。或者我误解了正在发生的事情。