小编R..*_*R..的帖子

将va_list或指针传递给va_list?

假设我有一个函数,它接受可变参数(...)或va_list从另一个这样的函数传递.主要逻辑是在这个函数本身(让我们调用它f1),但我想让它传递va_list给另一个函数(让我们调用它f2),它将确定下一个参数类型,使用它va_arg,并正确转换并存储它为呼叫者使用.

是否足以将va_list传递给f2,或者是否需要将指针传递给va_list.除非va_list需要是数组类型或者将其位置数据存储在va_list对象指向的位置(而不是在对象本身中),否则我无法看到如何通过值传递它可以允许调用函数(f1)为'看'被调用函数所做的更改va_arg.

任何人都可以阐明这一点吗?我对标准要求的内容感兴趣,而不是某些特定实现允许的内容.

c

20
推荐指数
1
解决办法
1万
查看次数

x86_64 va_list结构的格式是什么?

任何人都有参考va_listx86_64 ABI(在Linux上使用的那个)的表示?我正在尝试调试一些代码,其中堆栈或参数似乎已损坏,这将真正有助于理解我应该看到的内容......

c linux x86-64 abi variadic-functions

20
推荐指数
2
解决办法
1万
查看次数

是否可以选择GNU ld完全省略-dynamic-linker(PT_INTERP)?

我正在试验Linux上纯静态链接的PIE可执行文件的概念,但是遇到了GNU binutils链接器在使用时坚持在输出二进制文件中添加PT_INTERP头的问题-pie,即使在给出时也是如此-static.有没有办法抑制这种行为?也就是说,有没有办法告诉GNU ld具体不要将某些标题写入输出文件?也许使用链接器脚本?

(请不要回答声称它不起作用;我很清楚该程序仍然需要重定位处理 - 仅由于我的使用而导致的加载地址相对重定位-Bsymbolic- 并且我有特殊的启动代码代替Scrt1.o处理这个问题的标准.但是,如果没有动态链接器已经开始并且正在进行工作,除非PT_INTERP将二进制文件中的标题变为十六进制,否则我无法调用它.)

c dynamic-linking binutils static-linking pie-chart

20
推荐指数
2
解决办法
3779
查看次数

ELF目标文件和共享对象之间的ELF头差异是什么?

首先,我从技术角度问这个问题,而不是图书馆代码用户的角度.区别的一个例子是共享对象包含程序头,而普通目标文件则不包含.还有什么区别?

至于我的问题的目的,我试图弄清楚需要从共享对象文件中删除哪些内容,以使链接器将其视为普通对象文件并尝试重新定位并将其静态链接到生成的可执行文件中文件,而不是将其标识为共享库并生成DT_NEEDED引用.这反过来是将共享库原始"转换"为可以静态链接的东西的第一步(然而,可能需要进一步的工作以使重定位可满足).

c linux linker shared-libraries elf

19
推荐指数
1
解决办法
1732
查看次数

C/POSIX语言环境中扩展字节/字符的行为

C和POSIX都只需要在C/POSIX语言环境中存在非常有限的一组字符,但允许存在其他字符.这为实施留下了很大的自由; 例如,支持C语言环境中的所有Unicode(作为UTF-8)是符合行为的.但是,大多数历史实现都将C语言环境视为具有"8位清除"单字节字符编码,ISO-8859-1(Latin-1)或某种"抽象8位字符集",其中非ASCII字节是没有特定标识的抽象字符.(但是,在后一种情况下,如果编译器定义__STDC_ISO_10646__,它们规范地对应于Unicode字符,通常是Latin-1范围.)

另一个看似不太受欢迎的符合选项是将所有非ASCII字节视为非字符,即以EILSEQ错误响应它们.

我有兴趣知道是否有实现在实现C语言环境中采用这个或任何其他不寻常的选项.是否存在尝试在C语言环境中转换"高字节"的实现EILSEQ或除了将它们视为(抽象或拉丁-1)单字节字符或UTF-8之外的任何其他实现?

c locale posix character-encoding

19
推荐指数
3
解决办法
2036
查看次数

在Linux上,同一进程的线程之间的上下文切换成本

关于Linux上相同进程的线程之间的上下文切换成本是否有任何好的经验数据(x86和x86_64,主要是感兴趣的)?我说的是一个线程在自动或非自愿地进入睡眠状态之前在用户空间中执行的最后一个指令之间的周期数或纳秒数,以及在同一个CPU /核心唤醒后执行相同进程的不同线程的第一条指令.

我编写了一个快速测试程序,它不断执行rdtsc分配给同一个cpu/core的2个线程,将结果存储在volatile变量中,并与其姐妹线程的相应volatile变量进行比较.第一次检测到姐妹线程值的变化时,它会打印差异,然后返回循环.我在Atom D510 cpu上以这种方式获得了大约8900/9600个周期的最小/中值计数.这个程序看起来是否合理,数字看起来是否可信?

我的目标是估计在现代系统上,每个连接线程的服务器模型是否可以与选择型多路复用竞争甚至优于选择类型的多路复用.这似乎在理论上可行,因为从FD执行IO的过渡X金融衍生工具Y涉及仅仅会在一个线程睡眠,而在另一个醒来,而不是多个系统调用,但它是依赖于上下文切换的开销.

c linux posix pthreads context-switch

18
推荐指数
1
解决办法
6987
查看次数

使用gcc禁止默认库路径

有没有办法用gcc禁止默认的库路径搜索?-nostdinc对包含路径搜索执行此操作,但是-nostdlib,通过省略或设计,仅禁止-lc -lgcc等但不禁止库搜索路径.

c gcc

18
推荐指数
1
解决办法
7240
查看次数

是否有已知的O(nm)-time/O(1)空间算法用于POSIX文件名匹配(fnmatch)?

编辑: WHOOPS!很大的承认,我搞砸了?in fnmatchpattern语法的定义,似乎已经提出(并且可能已经解决)一个更难的问题,就像它.?在正则表达式中一样.当然,它实际上应该像.正则表达式一样(恰好匹配一个字符,而不是零或一个).这反过来意味着我最初的减少问题的工作足以解决(现在相当无聊)原始问题.解决更难的问题仍然很有趣; 我可能会在某个时候写出来.

从好的方面来说,这意味着像2way/SMOA针分解这样的东西可能适用于这些模式的可能性要大得多,这反过来又可以产生比原本更好的O(n)甚至O(n/m)性能.


在问题标题中,m设为模式/针n的长度,并且是与其匹配的字符串的长度.

这个问题对我很感兴趣,因为我看到/使用过的所有算法都有病态性能不佳和可能的堆栈溢出漏洞,这是由于回溯或需要动态内存分配(例如DFA方法或者只是避免在回调时进行回溯)如果某个程序fnmatch用于授予/拒绝某种访问权限,则会出现故障情况.

我愿意相信正则表达式匹配不存在这样的算法,但文件名模式语言比正则表达式简单得多.我已经将问题简化到可以假设模式不使用该*字符的程度,并且在这个修改过的问题中,您不匹配整个字符串,而是搜索字符串中模式的出现(如子字符串)匹配问题).如果你进一步简化语言并删除?字符,语言只是由固定字符串和括号表达式的连接组成,这很容易在O(mn)时间和O(1)空间中匹配,O(n)如果针分解,也许可以改进2way和SMOA子串搜索中使用的技术可以扩展到这种括号模式.然而,天真的每一个都?要求试验有或没有?消耗一个角色,带来时间因素在2^q哪里q?模式中的字符数.

有人知道这个问题是否已经解决,或者有解决问题的想法?

注意:在定义O(1)空间时,我使用的是Transdichotomous_model.

注2:本网站详细介绍了我引用的2way和SMOA算法:http://www-igm.univ-mlv.fr/~lecroq/string/index.html

c regex string substring pattern-matching

18
推荐指数
1
解决办法
448
查看次数

配置脚本中CFLAGS处理的最佳实践?

我不是autoconf的粉丝,但出于最不惊讶的原则,我试图使我的(非autoconf)配置脚本尽可能地与用户对基于autoconf的构建系统的期望一致.GNU编码标准在这个主题上实际上是相当合理的,并明确提到不使用autoconf/automake但以另一种方式提供兼容接口的可能性:

https://www.gnu.org/prep/standards/standards.html#Configuration

然而,我找不到任何好的描述的一个问题是如何最好地处理CFLAGS.我很清楚,任何不属于用户业务的基本标志(如-I$(srcdir)/inc)都不属于配置脚本或makefile中的CFLAGS,因为覆盖它们会完全破坏构建.所以这些我要么在makefile中硬编码,要么(如果需要一些检测)将检测逻辑置于configure中,但是将它们传递给一个单独的make变量而不是CFLAGS,这样它们就不会被覆盖.

我仍然对如何处理最好不清楚是什么,虽然是可选之类的优化水平/选项,警告标志,调试等应之类的东西启用标志--enable-debug或者--enable-warnings被添加到CFLAGS或在其他一些通过使变量?如果它们与用户提供的标志冲突CFLAGS怎么办?

我可以看到很多项目的答案应该只是"根本不要弄乱它并让用户选择他们的CFLAGS",但我的一些使用案例是用户群通常感兴趣的项目开箱即用的优化和调试配置.

编辑:我忘记的另一个问题:当涉及到检测并自动使用某些不是必需但首选的CFLAGS时,是否应该仅在用户CFLAGS在环境中留空时,或者总是这样做?

c autoconf makefile build configure

18
推荐指数
1
解决办法
7649
查看次数

int a = 1,b = a ++; 调用未定义的行为?

是否int a=1, b=a++;调用未定义的行为?在初始化器中初始化a及其访问和修改之间没有序列点介入b,但据我所知,初始化不是对象的"修改"; 指定初始值设定项以提供对象的"初始值".根据6.7.8初始化,第8段:

初始值设定项指定存储在对象中的初始值.

在对对象进行任何访问之前,将"initial"作为顺序进行似乎是合理的.此问题是否已经考虑过,是否有可接受的解释?

c undefined-behavior sequence-points language-lawyer

18
推荐指数
1
解决办法
982
查看次数