小编And*_*nle的帖子

永远不会执行的代码可以调用未定义的行为吗?

调用未定义行为的代码(在此示例中,除以零)将永远不会执行,程序是否仍未定义行为?

int main(void)
{
    int i;
    if(0)
    {
        i = 1/0;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为它仍然是未定义的行为,但我在标准中找不到支持或否认我的任何证据.

那么,有什么想法吗?

c language-lawyer

79
推荐指数
3
解决办法
4316
查看次数

一个程序是32位还是64位意味着什么?

这个问题:一个字在32/64位操作系统中分别包含多少位?提到字长是指处理器寄存器的位长-我指的是计算机处理器操作的位数,即处理器操作的最小“不可分割”位数。

那是对的吗?使用Word / Excel / etc等软件,安装程序可以选择32位或64位安装。有什么不同?

由于计算机体系结构是固定的,因此在我看来,“ 32位”软件将被设计为与具有32位体系结构的计算机体系结构保持一致。64位程序将努力使指令集与64位字长对齐。

那是对的吗?

这里提出了一个非常类似的问题:从编程的角度来看,当程序是32位或64位时,这意味着什么?-并且接受的答案提到差异是可以分配给应用程序的内存量。但这太含糊-除非32位/ 64位软件的概念与32位/ 64位字处理器的大小完全无关?

c 32bit-64bit

58
推荐指数
4
解决办法
7188
查看次数

为什么getenv标准化但不是setenv?

这个问题的答案和评论中,我理解这getenv是由C++标准定义的,但事实setenv并非如此.确实,以下计划

#include <cstdlib>
#include <iostream>

int main ( int argc, char **argv )
{
    std::cout << std::getenv("PATH") << std::endl;  // no errors

    std::setenv("PATH", "/home/phydeaux/.local/bin:...", true);  // error
}
Run Code Online (Sandbox Code Playgroud)

不为我编译(clang 3.9).

为什么这些看似互补的功能之一是标准化的而不是另一个?

c c++ language-lawyer

29
推荐指数
2
解决办法
1619
查看次数

如果目录不存在,是否可以在 POSIX 系统上自动创建目录?

POSIX 系统上是否有任何方法可以仅在目录不存在时自动创建目录?

相似

int fd = open( "/path/to/file", O_CREAT | O_EXCL | O_RDWR, 0644 );
Run Code Online (Sandbox Code Playgroud)

这不起作用:

int dfd = open( "/path/to/dir", O_DIRECTORY | O_CREAT | O_EXCL | O_RDWR, 0755 );
Run Code Online (Sandbox Code Playgroud)

失败对我的Solaris 11和Ubuntu 20.04系统errno设置为EINVAL在Solaris和ENOTDIRUbuntu上。

POSIXopen()文件指出此为O_CREAT

如果文件存在,则此标志无效,除非O_EXCL如下所述。否则,如果O_DIRECTORY没有设置...

嗯,它不是一个文件,并且O_DIRECTORY已经设置好了。

(受到问题Race condition stat 和 mkdir 的启发- 如果目录尚不存在,POSIX 中似乎没有任何方法可以自动创建目录。)

c posix

7
推荐指数
1
解决办法
101
查看次数

fork()的异步信号安全性

根据Oracle的多线程编程指南,fork()在信号处理程序内部应该是安全的.但是我的进程被卡在信号处理程序中,跟随回溯:

 #0  __lll_lock_wait_private () at   ../nptl/sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
 #1  0x00007f86e6a9990d in _L_lock_48 () from /lib/x86_64-linux- gnu/libc.so.6
 #2  0x00007f86e6a922ec in ptmalloc_lock_all () at arena.c:242
 #3  0x00007f86e6ad5e82 in __libc_fork () at ./nptl/sysdeps/unix/sysv/linux/x86_64/../fork.c:95
 #4  0x00007f86e7d9f125 in __fork () at ./nptl/sysdeps/unix/sysv/linux/pt-fork.c:25
....
 #7  signal handler called
Run Code Online (Sandbox Code Playgroud)

那么malloc在信号处理程序中使用是不安全的fork呢?

提前致谢.

c linux fork solaris glibc

6
推荐指数
1
解决办法
494
查看次数

wget 命令 SSL3_CHECK_CERT_AND_ALGORITHM 的问题:dh 密钥太小

我想检查一个 ssl url,但是当我使用命令时:

/usr/sfw/bin/wget --no-check-certificate --secure-protocol=SSLv3 https://url
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

--2018-10-01 12:11:19--  https://url
Connecting to #:443... connected.
OpenSSL: error:14082174:SSL routines:ssl3_check_cert_and_algorithm:dh key too small
Unable to establish SSL connection.
Run Code Online (Sandbox Code Playgroud)

是否可以跳过此控件?我使用: GNU Wget 1.18 建立在 solaris2.10 上。谢谢

ssl solaris wget

6
推荐指数
2
解决办法
3633
查看次数

标准要求重命名是原子的吗?

我试图回答这个问题时出现了一个有趣的问题:

我的fs上有mv原子吗?

rename()功能是否需要标准的原子功能?

州的POSIX标准rename的"基本原理"部分:

rename()对于ISO C标准定义的常规文件,此函数是等效的.它包含在此处扩展该定义以包括对目录的操作,并在新参数命名已存在的文件时指定行为.该规范要求函数的动作是原子的.

但是,最新公开的ISO C标准部分rename完整地指出:

7.21.4.2 rename功能

概要

#include <stdio.h>
int rename(const char *old, const char *new);
Run Code Online (Sandbox Code Playgroud)

描述

rename函数使得名称为指向的字符串的文件old由此指定的字符串给出的名称new.该名称old不再可以访问该文件.如果new在调用rename函数之前存在由指向的字符串命名的文件,则该行为是实现定义的.

返回

rename如果操作成功,则该函数返回零,如果失败则返回非零值,在这种情况下,如果该文件先前存在,则其原始名称仍然是已知的.

rename()在ISO C标准的部分中没有明确要求任何类型的原子性.

编写了许多程序,这些程序依赖于显然特定于实现的原子性rename(),我认为原子性是一个要求,并且对C标准的缺乏感到惊讶.

但POSIX标准表明ISO C标准要求rename()是原子的.

解释(S)?

c language-lawyer

5
推荐指数
1
解决办法
229
查看次数

当使用-fwrapv时,gcc中的签名溢出仍然是未定义的行为吗?

背景

默认情况下,signed overflow是未定义的行为.

我对gcc的理解(基于https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html-wwrapv做了什么?)是使用-fwrapv使gcc将签名溢出视为定义良好行为.

但是,对另一个问题的评论似乎表明,即使打开此标志,签名溢出仍然是未定义的行为.

是否使用-fwrapv在gcc中定义了溢出?如果没有,那么-fwrapv的目的是什么?

c gcc language-lawyer

5
推荐指数
1
解决办法
134
查看次数

collect2:致命错误:ld 以信号 11 终止 [分段错误]

我实际上无法在 C 中编译一个简单的“helloworld”。当我输入“gcc hello.c”时,输出是:collect2:fatal error: ld terminate with signal 11 [Segmentation fault]

有人有想法吗?

我试图重新安装 gcc、g++、make、cmake、binutils。这些事情都没有奏效。当我在终端中只输入“ld”时,输出是:“Segmentation Fault”

c linux ld ubuntu-18.04

5
推荐指数
2
解决办法
2841
查看次数

c编程shmat()权限被拒绝

我运行代码时遇到问题.我的shmat失败并打印权限被拒绝.我搜索谷歌如何解决它,但我不能.我的代码如下:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#define ERROR -1

int main ( int argc, char *argv[] ) {
    int shmid,key=50;
    int *val;
    int *x;
    int rw = -1;

    // 0 for write and 1 for read 

    shmid = shmget ( key, sizeof( int ), IPC_CREAT );

    if ( shmid == -1 ) {
        perror ( "Error in shmget\n" );
        return ( ERROR );
    }

    val = ( int * …
Run Code Online (Sandbox Code Playgroud)

c memory permissions shared-memory denied

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

带有模板的数组的大小

为什么我们需要一个模板来计算数组的大小,为什么我不能直接使用诸如int这样的预定义数据类型进行计算

我看过这样的代码

template<typename T,int SIZE>
size_t array_size(const T (&array)[SIZE])
{

    return SIZE;
}
Run Code Online (Sandbox Code Playgroud)

如果我们直接使用int而不是模板,为什么会抛出错误

int N;
int size(int (&arr1)[N]) //Passing the array by reference 
{
     return N; //Correctly returns the size too [cool trick ;-)]
}
Run Code Online (Sandbox Code Playgroud)

它如何计算大小

c++ c++11

-4
推荐指数
1
解决办法
98
查看次数