gpt4 book ai didi

c - mmap 有时会失败

转载 作者:太空宇宙 更新时间:2023-11-04 00:24:16 25 4
gpt4 key购买 nike

我正在尝试编译 John Viega 编写的 C 和 C++ 安全编程手册中的代码。以下代码片段打开一个可执行文件:

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>

int main(int argc, char *argv[ ]){
unsigned long entry;
unsigned char *buf;
struct stat sb;
int fd;

if (stat(argv[1], &sb)) {
fprintf(stderr, "Stat failed: %s\n", strerror(errno));
return 2;
}
if ((fd = open(argv[1], O_RDWR | O_EXCL)) < 0) {
fprintf(stderr, "Open failed: %s\n", strerror(errno));
return 3;
}
buf = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if ((int)buf < 0) {
fprintf(stderr, "Open failed: %s\n", strerror(errno));
close(fd);
return 4;
}
}

我在 Ubuntu 15.10 x86_64 (pr) 上用 gcc 5.2.1 编译了上面的代码。我已经从可执行文件 (pr2) 创建了一个副本。我不明白为什么以下调用有时成功,有时不成功(获取 Open failed: Success,返回 4):

./pr pr2    

最佳答案

不要将 buf 转换为 int。这是一个无意义的操作。指针很容易位于超过 INT_MAX 的范围内,导致转换后的整数成为一些没有实际意义的负值。

相反,检查 mmap 的返回值是否为 MAP_FAILED(即 (void*)-1):

    buf = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 
if (buf == MAP_FAILED) {
fprintf(stderr, "mmap failed: %s\n", strerror(errno));
close(fd);
return 4;
}

关于c - mmap 有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33479704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com