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

Bitshift和整数推广?

通常,C要求将二元运算符的操作数提升为更高级别操作数的类型.这可以被利用来避免用详细的强制转换填充代码,例如:

if (x-48U<10) ...
y = x+0ULL << 40;
Run Code Online (Sandbox Code Playgroud)

等等

但是,我发现,至少对于gcc,这种行为不适用于位移.即

int x = 1;
unsigned long long y = x << 32ULL;
Run Code Online (Sandbox Code Playgroud)

我希望右手操作数的类型可以促使左手操作数被提升,unsigned long long以便移位成功.但相反,gcc会打印一个警告:

warning: left shift count >= width of type
Run Code Online (Sandbox Code Playgroud)

gcc是否被破坏,或标准是否对位移的类型提升规则有所例外?

c standards gcc bit-manipulation integer-promotion

28
推荐指数
1
解决办法
5272
查看次数

在单个DNS查询中请求A和AAAA记录

我正在研究C中的DNS查询实现,并且有兴趣在单个查询数据包中请求A和AAAA(IPv4和IPv6)记录,但是当我将两个查询放在一起时,我没有从名称服务器获得任何响应像这样的一个数据包.我已经尝试将查询发送到几个不同的名称服务器(本地和8.8.8.8)没有运气.这是不起作用的,还是我的查询包可能格式错误?

我将AAAA查询附加到现有A请求数据包的基本算法是增加数据包头中的QDCOUNT字段,然后将TYPE设置为AAAA和NAME的RR查询作为指向现有A查询中主机名的指针追加(字节0xC0 0x0C表示从数据包开头起12字节的偏移量).这听起来不错吗?

仅供参考,一切都可以正常使用数据包中的A查询.

编辑:显然我的查询都有点格式错误(我不知道与答案不同的查询没有TTL和RDLENGTH/RDATA字段).修复此问题后,我将收到RCODE = 1格式错误回复,确认存在2个查询.这是否意味着不支持每个数据包的多个查询?

编辑2:这是一个查找的hexdump www.google.com:

d8 32 01 00 00 02 00 00 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c 65 03 63 6f 6d 00 00 01 00 01 c0 0c 00 1c 00 01

我没有看到它有什么问题.

c sockets dns networking network-protocols

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

是否有一个gcc选项假设所有extern"C"函数都不能传播异常?

有没有办法,没有在每个函数原型上放置一个属性,让gcc知道C函数永远不会传播异常,即内部声明的所有函数extern "C"都应该是__attribute__((nothrow))?理想的是-f样式命令行选项.

c c++ gcc exception-handling

27
推荐指数
1
解决办法
2819
查看次数

套接字选项是否从侦听套接字继承到accept()?

假设传递给的侦听套接字上accept设置了非默认选项setsockopt.这些选项(部分或全部?)是由接收连接的结果文件描述符继承的吗?

c sockets posix

27
推荐指数
3
解决办法
4452
查看次数

系统调用的历史是否已添加到Linux?

有什么地方我可以获得每个系统调用所需的最低Linux版本的完整列表吗?我正在寻找表格问题的一般答案"如果我使用系统调用X,我的代码可以运行的Linux的最低版本是什么?"

c linux assembly system-calls

27
推荐指数
2
解决办法
1185
查看次数

x86上交换与比较和交换锁的相对性能

两种常见的锁定习语是:

if (!atomic_swap(lockaddr, 1)) /* got the lock */
Run Code Online (Sandbox Code Playgroud)

和:

if (!atomic_compare_and_swap(lockaddr, 0, val)) /* got the lock */
Run Code Online (Sandbox Code Playgroud)

其中val可能只是一个常量或锁定的新潜在所有者的标识符.

我想知道的是x86(和x86_64)机器上的两者之间是否存在任何显着的性能差异.我知道这是一个相当广泛的问题,因为单个cpu模型之间的答案可能差异很大,但这是我要求的原因之一,而不仅仅是我可以访问的几个cpus的基准测试.

c x86 assembly locking atomic

25
推荐指数
2
解决办法
6220
查看次数

INT_MIN%-1是否会产生未定义的行为?

gcc SIGFPE为以下代码生成浮动代码:

#include <limits.h>
int x = -1;
int main()
{
    return INT_MIN % x;
}
Run Code Online (Sandbox Code Playgroud)

但是,我在标准中找不到此代码调用未定义或实现定义的行为的语句.据我所知,它需要返回0.这是gcc中的错误还是我错过了标准的一些特殊例外?

c gcc overflow division modulo

24
推荐指数
3
解决办法
1499
查看次数

GNU/Linux上有哪些WONTFIX错误以及如何解决它们?

Linux和GNU用户空间(glibc)似乎都有一些"WONTFIX"错误,即责任方已声明他们不愿意修复的错误,尽管明显违反了ISO C和/或POSIX的要求,但我不知道程序员的任何资源,列出了这些错误和解决它们的建议.

以下是一些想到的:

  • Linux UDP select错误:( select和相关接口)标记UDP套接字文件描述符,一旦收到数据包就准备好读取,而不确认校验和.在后续recv/ read/ etc.,如果校验和无效,则调用将阻塞.解决此问题需要始终将UDP套接字设置为非阻塞模式并处理该EWOULDBLOCK情况.如果我没记错的话,MaraDNS是第一个受这个bug影响的着名项目,也是第一个抱怨(不成功)修复它的项目.注意:正如Martinv.Löwis所指出的,显然这个bug已被修复.如果您需要支持真正过时的Linux版本,可能只需要解决方法.
  • 当指定字段精度(如)时printf,GNU C库中的族错误地将参数%s视为多字节字符串而不是字节字符串%.3s,从而可能导致截断输出.我知道除了替换整个printf子系统之外没有解决方法(或者根本不使用printf具有非多字节字符字符串的函数系列,但如果你想snprintf在UTF-8语言环境中使用while 处理遗留代码页字符串,这可能会有问题).
  • errno某些系统调用的结果代码错误(无法记住哪些系统调用正确).通常这些很容易检查您是否只是阅读GNU/Linux手册页并将它们与标准进行比较.(我无法找到此引用,也许我错了我能找到最接近的是问题,ENOTSUP并且EOPNOTSUP具有相同的价值;见PDTR 24715.

我们可以添加到此列表中的更多错误和解决方法是什么?我提出这个问题的目的是:

  1. 构建更完整的此类错误列表,以便新手和有经验的程序员能够快速了解​​在GNU/Linux上运行预期可移植程序时可能出现的潜在问题.
  2. 利用SO集体大脑来思考尽可能多的此类错误的聪明且不显眼的标准解决方法,而不是每个人都必须在被蜇后发明自己的变通方法,并且可能以次优,丑陋或hackish方式这样做 - 或者更糟糕然而,以打破对更符合要求的系统的支持的方式.

c linux posix standards-compliance

21
推荐指数
1
解决办法
1409
查看次数

在线程程序中,fork(应该是)对信号处理程序是否安全?

我真的不确定POSIX对fork存在线程和信号的安全性的要求.fork被列为异步信号安全功能之一,但如果库代码有可能注册了pthread_atfork非异步信号安全的处理程序,这是否会否定安全性fork?答案取决于运行信号处理程序的线程是否可以使用atfork处理程序所需的资源?或者换句话说,如果atfork处理程序使用同步资源(互斥体等)但是fork从一个从不访问这些资源的线程中执行的信号处理程序调用,程序是否符合要求?

在这个问题的基础上,如果"线程安全"分叉在系统库内部使用建议的惯用语实现pthread_atfork(获取prefork处理程序中的所有锁并释放父和子postfork处理程序中的所有锁),那么就是fork安全的在线程程序中使用信号处理程序?处理信号的线程是否可能处于调用mallocfopen/ fclose和持有全局锁的过程中,从而导致死锁fork

最后,即使fork在信号处理程序中是安全的,在信号处理程序中是否安全fork然后从信号处理程序返回,或者fork在信号处理程序中进行调用总是需要后续调用函数_exit或其中一个exec函数.信号处理程序返回

c deadlock fork signals pthreads

21
推荐指数
2
解决办法
3026
查看次数

将本地svn repo转储转换为git

我搜索了相关的问题,但是找不到与我的具体情况相符的任何东西:我有一些SVN服务器的旧存储库档案,这些档案在几年前被删除了.它们是服务器上原始存储库结构的tarball.我想要做的是将它们转换为git存储库,作为未来工作/恢复项目的基础.我已经阅读了几个关于转换过程的教程,我想我可以找出作者转换,分支映射等,但他们都假设你有一个SVN服务器和一个存储库的URL.我是否需要安装和设置SVN服务器才能进行此转换,或者我是否可以通过某种方式指向git clone或者svn2git(或其他工具)在我的repo转储中?

svn git version-control svn2git

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