首页 > 解决方案 > 这个 C 程序安全吗?

问题描述

我担心这个程序中的内存泄漏。具体来说,该check_if_pal过程增加str指针以隐藏第一个字符。这会干扰自动内存分配吗?使用堆会更安全吗?我需要str在返回之前恢复吗?

这是代码:

# include <stdio.h>
# include <string.h>

int check_if_pal(char *);

int main(int argc, char *argv[]) {

        char *not;

        for (int i = 1; i < argc; i++) {
                if (check_if_pal(argv[i])) {
                        not = " not";
                } else {
                        not = "";
                }

                printf("%s is%s a palindrome.\n", argv[i], not);
        }

        return 0;
}

int check_if_pal(char *str) {

        while (strlen(str) > 1) {
                if (str[0] != str[strlen(str) - 1]) {
                        return 0;
                }

                str[strlen(str) - 1] = '\0';
                str++;
        }

        return 1;
};

标签: cstringmemory-leakspalindrome

解决方案


这个 C 程序安全吗?

str由于您如何操作指针,因此很难分析。根据代码的编写方式,证明程序是内存安全的可能非常容易或非常困难。

例如,尝试strlen只调用一次并保持str不变。这样,您会发现证明索引保持在界限内要容易得多。

我担心这个程序中的内存泄漏。

因为没有分配,所以没有内存泄漏。

具体来说,check_if_pal 过程增加 str 指针以隐藏第一个字符。这会干扰自动内存分配吗?

不,它不会。

使用堆会更安全吗?

这取决于环境、操作系统、编译器、使用的标志......

不过,总的来说,堆可能更容易发现错误(尤其是在调试时),因为分配更加明确。

我需要在返回之前恢复 str 吗?

不,指针是一个副本,所以你可以做任何你想做的事情。


推荐阅读