Tag: gnu

如何纠正*** glibc在程序中检测到***错误

可能重复: glibc检测到错误 嗨,当我在开关盒中按下一个选项时收到此错误时,我正在GNU C ++中执行我的项目。 由于程序的其余部分正在执行,我留下了这个错误。 我不知道它是什么以及它为什么会发生。 请解释并指导我在哪里开始查看我的程序。 错误详情: *** glibc detected *** ./test.out: free(): invalid pointer: 0xbfb1c874 *** ======= Backtrace: ========= /lib/libc.so.6[0x55c0f1] /lib/libc.so.6(cfree+0x90)[0x55fbc0] ./test.out[0x809f855] ./test.out[0x804fbc0] ./test.out[0x804f9bb] ./test.out[0x80502bb] ./test.out[0x805084e] ./test.out[0x8050d07] /lib/libc.so.6(__libc_start_main+0xdc)[0x508e8c] ./test.out[0x8049981] ======= Memory map: ======== 004f3000-00631000 r-xp 00000000 08:01 6148422 /lib/libc-2.5.so 00631000-00633000 r-xp 0013e000 08:01 6148422 /lib/libc-2.5.so 00633000-00634000 rwxp 00140000 08:01 6148422 /lib/libc-2.5.so 00634000-00637000 […]

C / C ++,FORTRAN,下划线和GNU Autotools

我有一个关于使用gcc和gfortran的混合语言编程(C / C ++和FORTRAN)的问题。 我搜索了很多“用语言X混合fortran”并且无法解决这个问题。 我不确定这是链接问题还是编译器问题,或两者兼而有之。 我创建了三个文件,我使用GNU Autotools构建原始应用程序,但应该能够独立于命令行构建应用程序。 C文件(main.c)将是驱动应用程序,它调用几个FORTRAN函数: /* this is a simple program */ #include /* add the extern function definition */ #include “fooonly.h” // this is not working for the mixed language programming stuff yet… /* this is the main program section */ int main( int argc, char *argv[] ) { int […]

试图粉碎堆栈

我试图重现stackoverflow结果,我从Aleph One的文章“粉碎堆栈的乐趣和利润”中读到(可以在这里找到: http : //insecure.org/stf/smashstack.html )。 试图覆盖返回地址似乎对我不起作用。 C代码: void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; int *ret; //Trying to overwrite return address ret = buffer1 + 12; (*ret) = 0x4005da; } void main() { int x; x = 0; function(1,2,3); x = 1; printf(“%d\n”,x); } 拆卸主要: (gdb) disassemble main Dump […]

“GNU C中的语句和声明”是否特定于GNU C?

表达式中的语句和声明是否特定于GNU C? 或者这个function也包含在C99标准中?

如何从hsearch中删除元素

我正在使用GNU C库提供的hsearch_r函数。 我看到虽然我可以使用hsearch_r将元素添加到HASH表中并将操作作为ENTER传递,但我看不到从HASH表中删除元素或条目。 有人知道为什么会这样吗? 我可以执行以下操作来实现删除function。 我首先使用hsearch_r搜索它,其操作为FIND。 然后,一旦我得到一个指向hash_element的指针,然后我释放它。 那会有用吗? 如果我只能添加元素并搜索它们,那么哈希库有什么用处。 为什么不提供删除例程? 我试着用谷歌搜索hsearch库的源代码而无法找到它。 有人也能指出我的意思吗? http://linux.die.net/man/3/hcreate_r 编辑: 我也看到,如果我用动作ADD调用hsearch_r两次,那么它既不会抛出错误,也不会使用新值更新散列。 这很奇怪。 这意味着内部hsearch不实现替换function,我们必须自己完成,即首先进行搜索,然后如果存在,则删除第一个条目,然后添加一个新条目。 但是要做到这一点,我们需要从哈希中删除一个元素,我无法做到。

使用makefile编译头依赖项

我正在用C编程语言编写UDP客户端服务器应用程序; 我想在依赖项发生变化时自动编译2个源文件和3个头文件,所以我决定使用make实用程序。 makefile目标称为“编辑” : edit : server_UDP.o client_UDP.o \ gcc -o edit server_UDP.o client_UDP.o \ client_UDP.o : client_UDP.c cliHeader_UDP.h wrapHeader.h gcc -c client_UDP.c server_UDP.o : server_UDP.c servHeader_UDP.h wrapHeader.h gcc -c server_UDP.c 当我在wrapHeader.h中更改几行代码时,它不会触发重新编译。 当wrapHeader.h中有更改以重新编译server_UDP和client_UDP时,如何修改编辑makefile规则? **注意 :wrapHeader.h是主标题 cliHeader_UDP.h:包含“wrapHeader.h” servHeader_UDP.h:包含“wrapHeader.h”

memmem是GNU扩展的特殊原因吗?

在C中, memmem函数用于定位存储区中的特定字节序列。 它可以被同化为strstr ,它专用于以null结尾的字符串。 这个函数是否有任何特殊原因可用作GNU扩展,而不是直接在标准库中? 手册说明: 这个function在Linux库中被破坏,包括libc 5.0.9; 在那里,针和干草堆参数互换,并返回指向第一次出现针的末尾的指针。 旧的和新的libc都有错误,如果针是空的,则返回haystack-1(而不是haystack)。 并且glibc 2.0使情况变得更糟,返回指向haystack的最后一个字节的指针。 这在glibc 2.1中得到修复。 我可以看到它经历了几个修复,但我想知道为什么它不像某些发行版上的strstr直接可用(如果不是更多)。 它是否仍然会带来实施问题? 编辑:动机。 如果标准memmem决定它,我不会问这个问题:包括memmem而不是strstr 。 实际上, strstr可能是这样的: memmem(str, strlen(str), “search”, 6); // or memmem(str, strlen(str) – 1, “search”, 6); 考虑到在C函数中通常需要数据块和它的长度 ,这是一个相当棘手的但仍然是一个非常合乎逻辑的单行。 编辑(2) :评论和答案的另一个动机。 引用Theolodis : 并非每个函数都是必需的,或者至少是大多数C开发人员,因此它实际上会使标准库变得不必要的巨大。 嗯,我完全同意,在使图书馆更轻,更快的时候,我总是在这里。 但那么……为什么strncpy和memcpy (来自keltar的评论)……? 我几乎可以问: 为什么可怜的记忆是“黑色的”?

需要程序来说明在GNU C中使用settimer和alarm函数

任何人都可以在gnu C中说明settimer或alarmfunction的使用,请参考一些程序示例吗? 我有一个连续处理一些数据的程序,我需要设置一个每t秒关闭一次的计时器/警报,响应于此,我需要将处理过的数据存储到一个文件中。 这个文件写入必须是异步的。 我浏览了GNU C Library页面,但我理解不了多少.. [编辑] 我得到了这个程序: #include #include #include #define INTERVAL 1 int howmany = 0; void alarm_wakeup (int i) { struct itimerval tout_val; signal(SIGALRM,alarm_wakeup); howmany += INTERVAL; printf(“\n%d sec up partner, Wakeup!!!\n”,howmany); tout_val.it_interval.tv_sec = 0; tout_val.it_interval.tv_usec = 0; tout_val.it_value.tv_sec = INTERVAL; /* 10 seconds timer */ tout_val.it_value.tv_usec = 0; setitimer(ITIMER_REAL, &tout_val,0); […]

为什么fgets函数已被弃用?

来自GNU C编程教程 : fgets (“file get string”)函数类似于gets函数。 这个函数已被弃用 – 这意味着它已经过时,强烈建议您不要使用它 – 因为它很危险。 这很危险,因为如果输入数据包含空字符,则无法分辨。 除非您知道数据不能包含null,否则不要使用fgets 。 不要使用它来读取用户编辑的文件,因为如果用户插入空字符,您应该正确处理它或打印清晰的错误消息。 如果可以,请始终使用getline或getdelim而不是fgets 。 我认为fgets函数遇到\0或\n时会停止; 当fgets应该正确处理输入时,为什么这个手册页建议空字节是“危险的”? 此外, getline和fgets之间的区别是什么,并且在C99或未来的C标准中真正被认为已弃用的fgets函数是什么?

GNU C中的__attribute __((const))vs __attribute __((pure))

GNU C中__attribute__((const))和__attribute__((pure))什么区别? __attribute__((const)) int f() { /* … */ return 4; } VS __attribute__((pure)) int f() { /* … */ return 4; }