通常,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中的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
我没有看到它有什么问题.
有没有办法,没有在每个函数原型上放置一个属性,让gcc知道C函数永远不会传播异常,即内部声明的所有函数extern "C"都应该是__attribute__((nothrow))?理想的是-f样式命令行选项.
假设传递给的侦听套接字上accept设置了非默认选项setsockopt.这些选项(部分或全部?)是由接收连接的结果文件描述符继承的吗?
有什么地方我可以获得每个系统调用所需的最低Linux版本的完整列表吗?我正在寻找表格问题的一般答案"如果我使用系统调用X,我的代码可以运行的Linux的最低版本是什么?"
两种常见的锁定习语是:
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的基准测试.
gcc SIGFPE为以下代码生成浮动代码:
#include <limits.h>
int x = -1;
int main()
{
return INT_MIN % x;
}
Run Code Online (Sandbox Code Playgroud)
但是,我在标准中找不到此代码调用未定义或实现定义的行为的语句.据我所知,它需要返回0.这是gcc中的错误还是我错过了标准的一些特殊例外?
Linux和GNU用户空间(glibc)似乎都有一些"WONTFIX"错误,即责任方已声明他们不愿意修复的错误,尽管明显违反了ISO C和/或POSIX的要求,但我不知道程序员的任何资源,列出了这些错误和解决它们的建议.
以下是一些想到的:
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.我们可以添加到此列表中的更多错误和解决方法是什么?我提出这个问题的目的是:
我真的不确定POSIX对fork存在线程和信号的安全性的要求.fork被列为异步信号安全功能之一,但如果库代码有可能注册了pthread_atfork非异步信号安全的处理程序,这是否会否定安全性fork?答案取决于运行信号处理程序的线程是否可以使用atfork处理程序所需的资源?或者换句话说,如果atfork处理程序使用同步资源(互斥体等)但是fork从一个从不访问这些资源的线程中执行的信号处理程序调用,程序是否符合要求?
在这个问题的基础上,如果"线程安全"分叉在系统库内部使用建议的惯用语实现pthread_atfork(获取prefork处理程序中的所有锁并释放父和子postfork处理程序中的所有锁),那么就是fork安全的在线程程序中使用信号处理程序?处理信号的线程是否可能处于调用malloc或fopen/ fclose和持有全局锁的过程中,从而导致死锁fork?
最后,即使fork在信号处理程序中是安全的,在信号处理程序中是否安全fork然后从信号处理程序返回,或者fork在信号处理程序中进行调用总是需要后续调用函数_exit或其中一个exec函数.信号处理程序返回
我搜索了相关的问题,但是找不到与我的具体情况相符的任何东西:我有一些SVN服务器的旧存储库档案,这些档案在几年前被删除了.它们是服务器上原始存储库结构的tarball.我想要做的是将它们转换为git存储库,作为未来工作/恢复项目的基础.我已经阅读了几个关于转换过程的教程,我想我可以找出作者转换,分支映射等,但他们都假设你有一个SVN服务器和一个存储库的URL.我是否需要安装和设置SVN服务器才能进行此转换,或者我是否可以通过某种方式指向git clone或者svn2git(或其他工具)在我的repo转储中?