问题标签 [libc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2145 浏览

c - 不同字符串指针/数组类型上的 strsep 分段错误

平台:Linux、OSX
编译器:GCC

我有一个简单的程序,目前让我感到困惑——我知道我正在弄乱几种不同类型的数组/指针来产生这个问题——它是故意的——我试图理解它。

列出的代码将按预期编译和运行,但data4在调用或更改时strsep(&data4, "e");会导致分段错误。我想了解为什么。data1data3

0 投票
4 回答
42157 浏览

linux - 链接旧版本的 libc 以提供更大的应用程序覆盖率

Linux 二进制文件通常动态链接到核心系统库 (libc)。这使得二进制文件的内存占用非常小,但依赖于最新库的二进制文件不会在旧系统上运行。相反,链接到旧库的二进制文件将在最新系统上愉快地运行。

因此,为了确保我们的应用程序在分发期间具有良好的覆盖率,我们需要找出我们可以支持的最旧的 libc 并将我们的二进制文件链接到它。

我们应该如何确定可以链接到的最旧版本的 libc?

0 投票
2 回答
11370 浏览

c - 如何在 C 中执行相当于“ulimit -n 400”的操作?

在启动用 C 编写的程序之前,我必须运行命令“ulimit -n 400”来提高允许打开文件的数量,但是有没有办法在 C 程序中执行等效操作?

也就是说,增加该进程允许打开的文件描述符的数量。(我对每个线程的限制不感兴趣。)

它会涉及设置 ulimits,然后分叉一个允许有更多打开文件的孩子吗?

当然,我可以编写一个运行 ulimit 的 shell 包装器,然后启动我的 C 程序,但感觉不太优雅。我还可以通过 bash 或 sh 的源代码 grep 看看它是如何在那里完成的 - 如果我在这里没有得到答案,也许我会这样做。

同样相关的是,如果您想在很多文件描述符上进行选择,请查看此处

0 投票
1 回答
2015 浏览

c - 尝试访问 C 中字符串上的字符时出现总线错误

我已经多次使用这行代码(更新:当字符串是函数的参数时!),但是当我现在尝试这样做时,我得到了一个总线错误(包括 gcc 和 clang)。我正在复制最简单的代码;

为什么我无法使用 p 指针更改字符串的第二个字符?

0 投票
1 回答
1791 浏览

c - 寻找纯 c 版本的 math.h 函数(无协处理器支持)

我必须使用一些静态处理 C 源代码的(半)自动验证软件(CBMC (链接) )。支持浮点,但没有所有数学函数的定义。尝试检查是否可以用它检查数字软件。

所以我需要这些功能。我正在寻找一些math.h不使用协处理器的定义(例如sqrt,、、pow余数、tanint// floatdouble

当我在一些 linux 发行版(可能是现在的 eglibc)附带的 libc 中寻找它时,我总是达到一个点,其中有一些处理器内在特性,例如硬件 sqrt 函数。

第 1 部分:搜索软件实现

我需要的是一个支持具有以下特征的数学函数的库:

  • 支持 IEEE 浮点数,但纯粹基于整数运行的库也会很棒,也许更好。
  • 正确性是一个关键因素。(隐藏在某些来源中的特殊情况的已知错误并不那么酷)。根据 IEEE-754(例如 sqrt 规则),结果也应该是正确的。
  • 不使用协处理器调用。纯软件。C 是首选,但 asm 也应该没问题。

到目前为止,我搜索了一些 libc 实现,尤其是关于嵌入式系统的实现。我认为这些库中的大多数都针对已编译程序的可移植性和大小,但很难判断它们是否使用了特定于处理器的指令。

  • ** fdlibm 乍一看似乎有一些纯软件定义。我将进一步检查。但是源代码中提到了一些错误(代码不是标准的)。
  • ** newlib似乎带来了相同的定义(基于 sun 微系统的代码)。但目前我不能确定是否始终使用这些软件版本,因此可能有一些我目前看不到的协处理器调用(见第 2 部分)。
  • ** uClibc似乎与 newlib 共享该特性。

第 2 部分:了解这些实现的结构

  • 有人能给我简要介绍一下这些数学库的结构吗?他们如何分派各种版本(例如特定的协处理器)?

  • 文件名中这些不同前缀的含义是什么。e_sqrt.c, k_sin, s_sin?

我很高兴听到一些对我有用的库。我更喜欢自带库,但有必要的时候,也可以找一些单一的函数实现,搭建一个小库。我不会使用 math.h 中定义的所有函数。

这个这个SO-posts 说 Java 数学实现是/是基于fdlibm的,这听起来这个库是要走的路。我应该知道有关此库的更多信息的人吗?

似乎我有很多可能性,包括以下两种:

  1. 使用 glibc 并在软件模式下编译。问题是,我不能使用任何自动系统检查工具(在配置中)。我必须手动提供所有信息。是否有任何标志禁止使用 fp 协处理器和禁止 simd 操作?fp-without 应该是一个开始,然后如果它编译它也使用软浮点。我希望编译过程或多或少取决于主机的特定决定(如 arm ...)。
  2. 使用 fdlibm(目前首选)。问题:如何将我的程序链接到它?我需要像 assert 这样的非 libm 函数,但想要链接到我的 fdlibm 而不是已安装的 system-libm(因此 -nodefaultlibs 将禁止使用 assert)。
0 投票
3 回答
1781 浏览

c - 返回 libc 在 gdb 中有效,但在单独运行时无效

我正在尝试使用以下简单代码返回 libc 技巧:

有趣的是,当我运行这个程序时,它以“分段错误”结束,但如果我使用 gdb 调试它并逐步运行它,它完全没问题,生成一个 shell 然后退出程序。有人遇到这种情况吗?或者有人可以指导我如何纠正这个问题吗?先谢谢了。我在 ArchLinux 内核:2.6.33,gcc 4.5.0。

0 投票
2 回答
1284 浏览

c - 我是否需要担心 Valgrind 在我的应用程序范围之外报告错误?

在运行 Valgrind 的memcheck工具时,我经常会收到数十万条(或更多,因为 Valgrind 在 100K 时中断)小的无效读取语句,例如:

这些语句指的是对我的应用程序(“ starch”)之外的函数的调用,这些函数似乎是libc. 这是我需要关心的事情吗?

编辑

如果我修改fwrite调用以删除一个字节,那么我的 gzip 流就会损坏。这是原始代码:

编辑 2

我想我看到了问题。我有in[STARCH_Z_CHUNK]和没有in[STARCH_Z_CHUNK + 1](同样对于out[])。如果我通过 调整freadfwrite语句-1,我似乎没有得到这些Invalid read of size 1语句,尽管我仍然看到很多特定于的Invalid read of size 4和:8zlib

编辑 3

-g如前所述,我正在重新编译它,它确实将行号与错误相关联。

但我只是在做一个简单strncpyargv[]变量,例如:

这应该将 null 终止的argv[2]字符串复制到uniqTag,但valgrind仍将其标记为错误。

编辑 4

这是错误消息:

这是两条相关的线;valgrind 说第二行是无效读取:

因为strlen(argv[2]) + 1 > strlen(argv[2]),这应该导致一个空终止的uniqTag

0 投票
5 回答
11950 浏览

c - 我应该释放/删除 getenv() 返回的 char* 吗?

以上是获取环境变量的代码,如果我不释放 getenv(char*) 返回的内存,会导致内存泄漏吗?如果不是,请回答为什么?

0 投票
2 回答
2245 浏览

c - posix regcomp 和 regexec 线程安全吗?具体来说,在 GNU libc 上?

这里真的有两个单独的问题:我可以在没有锁定的多线程程序中使用正则表达式吗?如果可以,我可以在多个线程中同时使用相同的 regex_t 吗?我在 Google 或联机帮助页上找不到答案。

0 投票
7 回答
1731 浏览

c++ - memmove 不动

memmove 并没有真正移动内存,不是吗?它只是将内存从一个区域复制到另一个区域,并允许这两个区域重叠。我问这个问题是因为我只想知道为什么这个 fnc 以非常误导的方式被调用。
因为我知道当某物从一个地方移动到另一个地方时,“东西”是在这个操作之后在另一个地方而不是在第一个地方。而使用 memmove 则不能那样工作。我对吗?