0

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

4

1 回答 1

1

制作两个文件,rc,main.c,如 rc:

int *r = 0;

主.c:

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

然后 cc main.c rc; ./a.out 如果它没有 sigsegv,则您的运行时正在为您映射一页空值。你可以自己做 - 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 :(

于 2019-11-06T20:18:20.447 回答