【问题标题】:Error: result of comparison of constant 255 with expression of type 'char' is always false错误:常量 255 与“char”类型表达式的比较结果始终为 false
【发布时间】:2020-08-17 14:00:44
【问题描述】:

我正在研究 cs50 pset4 恢复,进展顺利。但是,当我使用 if 语句检查该文件是否为 JPEG 时,clang 开始编写一些奇怪的错误消息。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  FILE *pFile;
  char *buffer = NULL;
  char *filename = NULL;
  // If user didn't print 2 items
  if (argc != 2) {
    printf("Usage: ./recover image\n");
    return 1;
  }
  // Open the file
  pFile = fopen(argv[1], "r");
  int j = 0;
  // checking the card by 512b chunks

  // loop (i=0,  i++);
  while (5 < 6) {
    int i = 0;
    i++;

    // k=fread (buffer, 512, i, *file);
    int k = fread(buffer, 512, i, pFile);
    // if buffer [0]== 0xff // checking if it's the header. If yes - creating a new jpeg; if not -
    // i++
    if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff &&
        (buffer[3] & 0xf0) == 0xe0) {
      // if it's not the first file, we should close the last one

      // sprintf
      sprintf(filename, "%03i.jpg", 2);
      // FILE = fopen (W)
      pFile = fopen(filename, "w");
      // fwrite (buffer, 512, j, *file1)
      fwrite(buffer, 512, j, pFile);
      // j=j+1
      j = j + 1;
    }
    // if k<512 - end of the loop
    if (k < 512) {
      return 0;
    }
  }
}

我还没有完成剩下的所有工作,但是当我看到这些错误消息时我停下了:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    recover.c  -lcrypt -lcs50 -lm -o recover
recover.c:29:15: error: result of comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
    ~~~~~~~~~ ^  ~~~~
recover.c:29:36: error: result of comparison of constant 216 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
                         ~~~~~~~~~ ^  ~~~~
recover.c:29:57: error: result of comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
                                              ~~~~~~~~~ ^  ~~~~
3 errors generated.
<builtin>: recipe for target 'recover' failed
make: *** [recover] Error 1

我尝试使用 help50,但发生了这种情况:

clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    recover.c  -lcrypt -lcs50 -lm -o recover
recover.c:29:15: error: result of comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
    ~~~~~~~~~ ^  ~~~~
recover.c:29:36: error: result of comparison of constant 216 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
                         ~~~~~~~~~ ^  ~~~~
recover.c:29:57: error: result of comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
                                              ~~~~~~~~~ ^  ~~~~
3 errors generated.
<builtin>: recipe for target 'recover' failed
make: *** [recover] Error 1

Asking for help...

recover.c:29:15: error: result of comparison of constant 255 with expression of type 'char' is always false [-Werror,-Wtautological-constant-out-of-range-compare]

Not quite sure how to help, but focus your attention on line 29 of recover.c!

当我尝试谷歌搜索时,我只是得到了整个问题的答案。我不知道该怎么办,请帮帮我。

谢谢, 迷失在代码中:)

【问题讨论】:

  • 字符从 -128 变为 127(在您的编译器上)。
  • Ohhhhh 好的,但我怎样才能修复此代码以使其正确并使其正常工作?我不能使用字符串,因为它们删除了 cs50.h “训练轮”。
  • 如果您不处理字符串,为什么要使用string?检查您的教科书以获取大小为 1 的替代数据类型。
  • 关于:char *buffer = NULL;char *filename = NULL; 分配/读取这些指针指向的位置(地址 0)的任何内容是引发 seg 故障事件的好方法。 (您不想这样做)建议:#define MAX_BUF_LEN 512 #define MAX_FILENAME_LEN 30 .... char buffer[ MAX_BUF_LEN ];` 和 char filename[ MAX_FILENAME_LEN ] ;
  • OT:关于:printf("Usage: ./recover image\n"); 错误消息应该输出到stderr,而不是stdout。建议:fprintf( stderr, "USAGE: %s imageFile\n", argv[0] );

标签: c char compare cs50


【解决方案1】:

char 在此实现上的范围从 -127 到 127(最小值)。因此,将其与 216 或 255 进行比较是徒劳的。所以将其设为unsigned char *buffer,至少存储 0 到 255。

还有,

隐式转换丢失整数精度:“size_t”(又名“unsigned long”)到“int”

是解释性的:size_t 内部是unsigned long,它可以存储比int 更多的正数。所以理论上你可能有 int 溢出。


一个类似的问题,但我的答案是 C++:

【讨论】:

  • 我真的不认为我有溢出。根据我对错误消息的理解,这是字符不能超过 127 的部分。
  • 我只回答了警告的内容。我不声称要修复任何错误。 \\ 如果您看到 C++ 答案,您会发现一个带有保留空间的向量。您只需将存储设置为空。 fread 将数据存储在哪里? \\ 我认为您应该提出一个新问题来尝试解决新发现的问题。
【解决方案2】:

将缓冲区声明为 uint8_t 缓冲区[512],因为没有分配空间来保存 512 个字节。 完成后请记住关闭文件,例如fclose(pFile)

【讨论】:

  • 欢迎来到 SO。虽然这确实是代码中的一个致命错误,但您的建议并不能回答问题。您的代码将提供相同的警告。
  • 是的,但还是谢谢。我一直在试图弄清楚如何关闭文件。你能告诉我它是怎么做的吗?我会添加一个关于它的问题,但主题太短了。
  • fopen()打开的文件用fclose()关闭
  • 谢谢,我不知道。
【解决方案3】:

在 MSCV 编译器上我收到了一些投诉

 while (5 < 6)

第 23 行,

警告 C4127:条件表达式是常量

它确实是一个常数。你可以改变它

        int k = fread(buffer, 512, i, pFile);

第 29 行,

从“size_t”转换为“int”,可能会丢失数据

fread() 返回size_t 无符号且kint,因此如果fread() 读取的字节数超过INT_MAX 字节,它可以变为负数。

我们也有

'buffer' 可能是 '0':这不符合规范 函数'fread'

确保它出现在其他部分。您已将 buffer 声明为

char* buffer = NULL;

并且从未为它分配内存。

我变了

char _buffer[512];
char* buffer = _buffer;

while

while (pFile) // pFile is not 0 

因为pFile指的是打开的文件,所以是真的

并向fread()添加了演员表

int k = (int) fread(buffer, 512, (size_t)i, pFile);

所以编译好了

【讨论】:

  • 我知道这是一个无限循环。如果你看一下我的代码底部,有一个 if 语句,里面有return 1;。所以一旦 if 语句被证明为真,它就会关闭程序并结束循环。
  • 这很常见,我不讨论它:是我的编译器在抱怨它,我只是告诉你,你可以通过使用 while(pFile) 来让任何编译器满意,达到同样的效果,因为pFile 是打开文件的句柄,并且在循环期间将与6&gt;5 一样真实
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
相关资源
最近更新 更多