像所有软件一样的编译器也容易出错,逻辑错误.
如何验证编译器生成的输出.通常,我的问题是(是)
如何验证生成的机器代码是否正确?
如何确保生成的机器代码符合语言规范.
选择一个开源项目(在C中,如果还在C中编写编译器)只是通过"编译器"编译它是否有意义.在这种情况下,如何判断编译器的行为是否符合预期.
是否有语言标准委员会提供的"语言符合"编译器必须满足的正式测试用例(文献)?
什么是"赠送",编译器编译的程序中的问题是编译器错误而不是程序错误.
- 主流编译器混淆并编译代码错误的任何例子?
任何文献的链接将不胜感激.
在http://linux.die.net/man/2/select上,在BUGS部分,提到选择系统调用有时可以虚假地设置FD就绪,随后的读取调用将返回0.文本描述了一个这样的例子(错误的校验和)但我假设还有其他原因(否则他们会解决这个问题).
任何想法可能导致另一个原因选择返回FD准备虚假.
这是否也适用于其他操作系统.我目前正在询问Linux.
上述链接的相关部分:
在Linux下,select()可以将套接字文件描述符报告为"准备好读取",而不是后续的读取块.这可能例如在数据到达时发生但在检查时具有错误的校验和并被丢弃.可能存在其他情况,其中虚假地报告文件描述符为就绪.因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全.
我刚开始学习pthreads API,我在这里遵循教程
但是,在一个示例程序中pthread_create,示例程序创建一个long变量并传递其值,将其类型化为void*.在线程入口函数中,它解除它就像一个long.
这是合法的吗?我理解如果我传递变量的地址t,每个线程将作用于同一个变量而不是它的副本.我们可以这样做,因为它是一个void*,编译器不知道我们发送什么类型?
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5
void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is …Run Code Online (Sandbox Code Playgroud) 我目前正在linux中编写一个小型UDP服务器程序.UDP服务器将来自两个不同的对等体接收分组,并且基于它接收到的分组从哪个对等体将执行不同的操作.我正在尝试确定收到数据包的来源.但是,当select返回并recvfrom调用时,它将返回错误的无效参数.如果我将NULL作为倒数第二个参数传递,则recvfrom成功.
我曾尝试宣告fromAddr为struct sockaddr_storage,struct sockaddr_in,struct sockaddr没有任何成功.这段代码有问题吗?这是确定数据包来源的正确方法吗?
代码片段如下.
`           
    /*TODO : update for TCP. use recv */
    if((pkInfo->rcvLen=recvfrom(psInfo->sockFd,
                                pkInfo->buffer,
                                MAX_PKTSZ,
                                0,
                               /* (struct sockaddr*)&fromAddr,*/
                               NULL,
                              &(addrLen)
                              )) < 0)
    {
       perror("RecvFrom failed\n");
    }
    else
    {
       /*Apply Filter */
    #if 0
       struct sockaddr_in* tmpAddr;
       tmpAddr = (struct sockaddr_in* )&fromAddr;
       printf("Received Msg From %s\n",inet_ntoa(tmpAddr->sin_addr));
    #endif
      printf("Packet Received of len = %d\n",pkInfo->rcvLen);
    }
`
Run Code Online (Sandbox Code Playgroud) 我已经读过free()"一般"不会将内存返回给操作系统.我们可以移植使用free()的这个功能吗?例如,这是便携式吗?
 /* Assume I know i would need memory equivalent to 10000 integers at max
    during the lifetime of the process */
 unsigned int* p = malloc(sizeof(unsigned int) * 10000);
 if ( p == NULL)
  return 1;
 free(p);
 /* Different points in the program */
 unsigned int* q = malloc(sizeof(unsigned int) * 5);
 /* No need to check for the return value of malloc */
Run Code Online (Sandbox Code Playgroud)
我正在编写一个演示版,我事先知道call contexts要支持多少.
是否可以提前分配"n"数量,"call contexts" structures然后free立即分配.这能保证我未来的 …
在TCP套接字编程中,如果recv()返回0,则将其视为另一方关闭其连接的指示.但是,AFAIK,TCP RFC并不要求TCP的有效载荷大于0.因此,理论上,TCP堆栈可以接收带有效载荷0的消息.
所以,基本上我的问题是,recv()如果收到大小为0的有效负载数据包会返回什么?如果它返回0,那么我们如何将其与闭合连接指示区分开来.