c中使用gets() 提示warning: this program uses gets(), which is unsafe.

本文解释了C语言中gets()函数为何被认为是不安全的,并提供了一个更安全的替代方案fgets()。gets()函数由于未检查缓冲区大小可能导致缓冲区溢出。

今天在C代码中使用gets()时提示“warning: this program uses gets(), which is unsafe.”,然后这个程序还能运行,无聊的我开始查阅资料,为啥gets()会unsafe呢。

通过Google查阅前辈的问答,原来是这么回事。

gets()这个函数只有一个参数,那就是字符缓冲区的指针,并没有指定该缓冲区的长度也就是大小。当你输入一个很长很长的字符串的时候,gets ()函数会把每一个字符都存入到栈(statck)中,因此当字符串很大的时候就会导致程序异常终止。前辈们给的建议是使用fgets()函数替代gets()。

例子:

 

?
1
2
3
4
5
6
7
8
9
10
11
//使用gets()
 
char buffer[4096];
 
gets(buffer);
 
//使用fgets()替换gets()
 
char buffer[4096];
 
fgets(buffer, ( sizeof buffer / sizeof buffer[0]), stdin);

 参考网址:

1、Stackoverflow

### Java中关于System.load和sun.misc.Unsafe方法的警告问题 在Java开发中,`System.load` 和 `sun.misc.Unsafe` 的使用可能会引发警告或潜在的安全隐患。以下是关于如何解决这些问题的详细说明。 #### 1. 关于 `System.load` 的警告 `System.load` 方法用于加载本地库文件(如 `.dll` 或 `.so` 文件)。然而,直接使用此方法可能导致路径依赖性问题或跨平台兼容性问题。为了避免这些警告,可以考虑以下替代方案: - 使用 `System.loadLibrary(String libName)` 方法[^1],它允许通过库名称加载本地库,而不是指定完整路径。这种方式更符合跨平台开发的需求。 - 确保本地库文件位于系统库路径中,或者将其添加到 `java.library.path` 中。可以通过 `-Djava.library.path` JVM 参数来设置路径。 示例代码: ```java static { try { System.loadLibrary("nativeLib"); // 加载本地库 } catch (UnsatisfiedLinkError e) { System.err.println("Native code library failed to load.\n" + e); } } ``` #### 2. 关于 `sun.misc.Unsafe` 的警告 `sun.misc.Unsafe` 是一个内部类,提供了对低级内存操作的支持。尽管功能强大,但它的使用存在以下问题: - 它是非公开API的一部分,可能在未来的JDK版本中被移除。 - 使用 `Unsafe` 可能导致程序不稳定或安全漏洞。 为了减少警告并提高代码的可维护性,可以采取以下措施: - 替换为官方支持的API:例如,使用 `VarHandle` 或 `ByteBuffer` 来实现类似的功能[^2]。 - 如果必须使用 `Unsafe`,可以通过反射获取其实例,并确保仅在受控环境中使用。 示例代码: ```java import java.lang.reflect.Field; public class UnsafeExample { public static void main(String[] args) throws Exception { Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); sun.misc.Unsafe unsafe = (sun.misc.Unsafe) field.get(null); long offset = unsafe.objectFieldOffset(MyClass.class.getDeclaredField("value")); MyClass obj = new MyClass(); unsafe.putInt(obj, offset, 42); // 设置字段值 System.out.println(obj.value); // 输出42 } } class MyClass { public int value; } ``` #### 3. 替代方案:使用 `VarHandle` 从Java 9开始,`VarHandle` 提供了一种更安全的方式来访问字段和数组元素。它可以作为 `Unsafe` 的替代品之一[^3]。 示例代码: ```java import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; public class VarHandleExample { public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { VarHandle handle = MethodHandles.lookup() .findVarHandle(VarHandleExample.class, "value", int.class); VarHandleExample example = new VarHandleExample(); handle.set(example, 42); // 设置字段值 System.out.println(handle.get(example)); // 输出42 } public int value; } ``` #### 总结 通过上述方法,可以有效减少 `System.load` 和 `sun.misc.Unsafe` 的使用带来的警告问题。推荐优先使用标准API,以确保代码的可移植性和安全性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值