- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个程序来计算 stdin 给出的输入行数:
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#define BUFF_SIZE 8192
#define RS '\n'
int
main(int argc, char **argv)
{
char buff[BUFF_SIZE];
ssize_t n;
char *r;
int c = 0;
readchunk:
n = read(0, buff, BUFF_SIZE);
if (n<=0) goto end; // EOF
r=buff;
searchrs:
r = memchr(r, RS, n);
if(r!=NULL) {
c++;
if((r-buff)<n) {
++r;
goto searchrs;
}
}
goto readchunk;
end:
printf("%d\n", ++c);
return 0;
}
我用 gcc 编译它,没有任何选项。
运行时,它给出的结果不稳定,与事实相差不远,而是错误的。有时会出现段错误。缓冲区大小越大,出现段错误的频率就越高。
我做错了什么?
最佳答案
使用 -fsanitize=address
构建程序并为其提供足够长的输入会产生:
==119818==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffedbba1500 at pc 0x7fc4d56fd574 bp 0x7ffedbb9f4a0 sp 0x7ffedbb9ec50
READ of size 8192 at 0x7ffedbba1500 thread T0
#0 0x7fc4d56fd573 (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x40573)
#1 0x563fdf5f4b90 in main /tmp/t.c:23
#2 0x7fc4d533e2b0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202b0)
#3 0x563fdf5f49c9 in _start (/tmp/a.out+0x9c9)
Address 0x7ffedbba1500 is located in stack of thread T0 at offset 8224 in frame
#0 0x563fdf5f4ab9 in main /tmp/t.c:11
This frame has 1 object(s):
[32, 8224) 'buff' <== Memory access at offset 8224 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
(longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x40573)
第 23 行是对 memchr
的调用。
当您增加r
时,您可能应该减少n
。
关于使用 memchr 计算输入行数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52507510/
问题:如果你这样做 if ( ptr = memchr( str1, '4', sizeof(str1) ) ) { // do stuff using ptr } 然后你每次都会输入并做“东
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我编写了一个程序来计算 stdin 给出的输入行数: #include #include #include #include #define BUFF_SIZE 8192 #define R
我尝试理解并重写 memchr 函数,但我在代码开头发现了一些奇怪的东西。 我们可以读到: #include "libc.h" #include void *my_memchr(void co
我正在尝试在二进制文件中查找 0x0D0A。但是 strchr 在找到 0x00 时停止并且我没有找到正确的位置。 请告诉我为什么它不起作用 #include #include #include
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
背景:我正在尝试创建一个纯 D 语言实现的功能,大致相当于 C's memchr但使用数组和索引而不是指针。原因是 std.string 将与编译时函数评估一起使用。对于那些不熟悉 w/D 的人,如果
我试图解决的实际问题是搜索出现的位模式(110xxxxx、1110xxxx、11110xxx)表示UTF-8中多字节字符的开始。 我希望找到速度与 memchr() 类似的东西,但没有找到任何东西。我
我正在尝试解析格式类似于 1-3,5-7 的字符串。我需要阅读 1,3 和 5,7。 我在做什么 char *dup_string; dup_string = strdup(data); tok =
我正在使用 Visual Studio 2008。 在 C++ 中,我可以使用 memchr 在一维数组中搜索元素。 char* pStart, char* pEnd; //find first a
除了额外的参数之外,memchr() 和 strchr() 之间的实际区别是什么?你什么时候使用其中一种或另一种?如果解析一个大文件(理论上来说),用 memchr() 替换 strchr() 会有更
有人可以帮我解决这个问题吗?如果名称中存在字母,我正在尝试检查每个目录条目。显然这是行不通的。我的主要问题是我在使用 namelist[n]->d_name 作为内存时是否正确使用了 memchr?
在 C11 和 C++111 中定义了以下行为吗? bool has4() { char buf[10] = {0, 1, 2, 4}; return memchr(buf, 4,
我目前正在重新编写一些 C 库。所以我的问题是:为什么 memchr 采用 const void *s 指针而不是简单的字符指针? 我知道您可能会搜索其他内容,但该函数的字面意思是 memchr,所以
我目前正在重新编写一些 C 库。所以我的问题是:为什么 memchr 采用 const void *s 指针而不是简单的字符指针? 我知道您可能会搜索其他内容,但该函数的字面意思是 memchr,所以
FreeBSD's generic implementation of memchr做: void * memchr(const void *s, int c, size_t n) { if
我在 mac os x 上使用 memchr() 时遇到溢出的问题。 这是我的测试代码: #include #include int main(void){ char *content="
下面的函数使用int作为第二个参数类型, memchr(const void *buf, int ch, size_t count); 尽管它用于字符 类型。为什么函数定义为使用int 作为char
自从我在标准 头文件中无缘无故地收到此错误以来已经有一段时间了。谷歌搜索带来了许多答案,但没有一个有效。 最佳答案 好的,我自己修好了。这是一个愚蠢的错误!我在一个库项目中有一个名为“String.h
我正在阅读 sehe's answer至 this question并且惊讶地看到 sehe 发现使用 std::memchr 的手写循环比使用 std::count 快 3 倍以上 (看评论)。使用
我是一名优秀的程序员,十分优秀!