如何编译使用不推荐使用的函数的C程序,例如gets()

如何编译使用不推荐使用的函数的C程序,例如gets(),c,linux,gcc,C,Linux,Gcc,对于家庭作业,我必须尝试使用缓冲区溢出使一个简单的c程序崩溃。我的问题是,我的编译器不会编译gets函数,因为它已弃用且不安全。我理解这一点,但为了这个例子,我想覆盖它。代码如下: #include <stdio.h> int main(int argc, char *argv[]) { int valid = 0; // Char arrays w/buffer set to 8 chars char str1[8]; char str2[8]

对于家庭作业,我必须尝试使用缓冲区溢出使一个简单的c程序崩溃。我的问题是,我的编译器不会编译gets函数,因为它已弃用且不安全。我理解这一点,但为了这个例子,我想覆盖它。代码如下:

#include <stdio.h>

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

    int valid = 0;

    // Char arrays w/buffer set to 8 chars
    char str1[8];
    char str2[8];

    next_tag(str1);

    //This is where I want to use gets and not fgets or other secure functions...
    gets(str2);

    if(strncmp(str1, str2, 8) == 0) {
        valid = 1;
    }

    // Print
    printf("Buffer 1: str1(%s), str2(%s), valid(%d)\n", str1, str2, valid);


}
我的gcc版本是:

rabbitfighter@ECHO:[~/Code/C/BufferOverflowExamples]: gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.1/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: /build/gcc/src/gcc-4.9-20140903/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --disable-isl-version-check --disable-cloog-version-check --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --disable-multilib --disable-werror --enable-checking=release Thread model: posix gcc version 4.9.1 20140903 (prerelease) (GCC)
如果有人能帮助我,我将不胜感激。我正在运行Manjaro Linux Arch。

您可以使用更安全的函数,如fgets,并为其提供虚假的缓冲区大小,以消除其不安全行为

大于实际缓冲区的缓冲区大小将使FGET超出其界限,并可能导致程序崩溃


仅仅因为枪有安全装置并不意味着你不能用它把脚打掉。

Q:当你编译一个使用gets的模块时会发生什么?编译失败时,您是否收到错误消息?或者你只是得到一个警告?您可以安全地忽略警告。@FoggyDay:嗯,您不能安全地忽略警告,但在这种情况下,安全不是重点。您到底是如何编译程序的?请更新您的问题,复制并粘贴您正在使用的gcc命令行。在我的系统中,没有添加选项的gcc只在编译时和链接时警告GET。对next_标记的未定义引用是一个致命错误。我尝试了gcc-obuffer1buffer1.c和gcc-Wdeprecated声明-obuffer1buffer1.c。两者都不起作用:正如@KeithThompson所说,它没有链接,因为您没有实现next_标记。您可以去掉与以下内容无关的警告:gcc buffer.c-o buffer-W-no-deprecated-declarations我想您没有读过我的问题。我必须使用这个代码。我必须使用gets。除非你的教练在背后监视,否则fgetsstr2,INT_MAX,stdin在你的情况下应该在功能上等同于gets。一个崩溃得到的字符串应该会崩溃fgets,我假设这是你的导师希望你产生的。您需要包含limits.h以获得INT_MAX。@JoshuaMichael在您的答案中,您并不是说您不能更改代码,+1以获得可能的功能等效解决方案。但我仍然认为代码应该编译——在这里是这样的——我很好奇它在我的LinuxMint机器上编译的错误,但不是Arch。这只是一些编译器仍然允许带有警告的GET,而一些编译器就是不这样做。多亏了谁否决了我的问题。当我只是问一个问题时,真的很好。@JoshuaMichael也许他们投了反对票,因为你没有按照评论中的建议,在问题中加入你使用的命令和确切的警告。