C rule

本文探讨了编程中常见的安全问题,如缓冲区溢出、格式字符串漏洞等,并提供了安全替代方案,如使用安全函数和限制输入长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

) 危険なコーディング

1                char cStr[256];

2                ZeroMemory(cStr, sizeof(cStr));

3                strcpy(cStr, src);    srcのサイズが256バイトを超えていた場合オーバーフロー!

 

修正)

1                char cStr[256];

2                ZeroMemory(cStr,0, sizeof(cStr));

3                strncpy(cStr, src, sizeof(cStr)-1); 

 

危険な関数

代替関数

gets

fgets

strcat

strncat

strcpy

strncpy

sprintf

snprintf

vsprintf

vsnprintf

 

危険な例)

#include <stdlib.h>

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

printf(argv[1]);

}

 

修正例)

#include <stdlib.h>

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

  printf("%s",argv[1]);

}

 

危険な関数

printf

sprintf

fprintf

vsprintf

snprintf

vsnprintf

 

 

※書式文字列の脆弱性

書式文字列(フォーマットストリング)とは、printf関数等で使用される書式を指定する文字列

のことである。リストの例では、入力された文字列のみ指定されており、書式文字列が省略された

形で呼び出されている。

 

リスト)

#include <stdlib.h>

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

         printf(argv[1]);

}

 

通常の文字列が入力される場合は問題ないが、書式文字列を含んだ入力を与えることで攻撃ができる。

printf関数では、書式文字列が指定されると、対応する変数が引数で与えられているものとして

動作するため、下図のように不正な動作となってしまう。

 

下図は単純な例であるが、不正コードを入力させ、実行させることも可能である。

 

"%n"を入力

printf(argv[1]);

戻りアドレス

引数1

 

実際のスタック領域

printf関数は、引数2があるものとして動作する。

printf("%n",<引数2>);

戻りアドレス

引数1

 

引数2

 

書換えられる!

"%n"を入力

printf(argv[1]);

戻りアドレス

引数1

 

実際のスタック領域

printf関数は、引数2があるものとして動作する。

printf("%n",<引数2>);

戻りアドレス

引数1

 

引数2

 

1)      scanf系関数を使用するときは、上限サイズを指定

scanf系の関数には、上限サイズを省略した書式が記述できてしまうため、上限サイズを指定した

書式を記述する。または、上限サイズを指定できるfgets関数に置き換える。

 

危険な例)

char buffer[256];

int num;

num = fscanf(stdin, "%s", buffer);

 

修正例①)

char buffer[256];

int num;

num = fscanf(stdin, "%255s", buffer);

 

修正例②)

char buffer[256];

fgets(buffer, 256, stdin);

 

危険な関数

scanf

sscanf

fscanf

vfscanf

vscanf

vsscanf

在计算机科学中,“rule”通常指代一系列定义明确的规则或条件,用于指导系统的行为、逻辑推理或数据处理。这些规则可以是形式化的,也可以是非形式化的,具体取决于应用场景。 ### 形式语言与自动机中的 Rule 在形式语言和自动机理论中,rule 通常指的是产生式(production rules),它们定义了如何生成字符串或如何转换状态。例如,在上下文无关文法(CFG)中,规则的形式为 $ A \rightarrow \alpha $,其中 $ A $ 是一个非终结符,而 $ \alpha $ 是由终结符和非终结符组成的字符串。这些规则决定了如何从起始符号逐步推导出语言中的字符串 [^2]。 ```python # 示例:上下文无关文法中的产生式规则 grammar = { 'S': ['aS', 'bA'], 'A': ['c'] } # 使用递归方法应用规则生成字符串 def generate_strings(current, grammar): if current[-1] not in grammar: return [current] results = [] for rule in grammar[current[-1]]: for result in generate_strings(current[:-1] + current[-1].replace(current[-1], rule, 1), grammar): results.append(result) return results print(generate_strings('S', grammar)) # 输出可能的字符串集合 ``` ### 数据结构中的 Rule 在数据结构中,rule 可以用来描述特定的数据组织方式或操作约束。例如,在平衡二叉搜索树(如 AVL 树)中,Balancing Rule 指的是每个节点的左右子树高度差不超过 1 的规则 [^4]。这个规则确保了树的高度保持对数级别,从而保证了查找、插入和删除操作的时间复杂度为 $ O(\log n) $。 ```python class Node: def __init__(self, key): self.key = key self.left = None self.right = None self.height = 1 class AVLTree: def insert(self, root, key): if not root: return Node(key) elif key < root.key: root.left = self.insert(root.left, key) else: root.right = self.insert(root.right, key) root.height = 1 + max(self.get_height(root.left), self.get_height(root.right)) balance = self.get_balance(root) # Left Heavy if balance > 1 and key < root.left.key: return self.right_rotate(root) # Right Heavy if balance < -1 and key > root.right.key: return self.left_rotate(root) # Left-Right Case if balance > 1 and key > root.left.key: root.left = self.left_rotate(root.left) return self.right_rotate(root) # Right-Left Case if balance < -1 and key < root.right.key: root.right = self.right_rotate(root.right) return self.left_rotate(root) return root def left_rotate(self, z): y = z.right T2 = y.left y.left = z z.right = T2 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def right_rotate(self, z): y = z.left T3 = y.right y.right = z z.left = T3 z.height = 1 + max(self.get_height(z.left), self.get_height(z.right)) y.height = 1 + max(self.get_height(y.left), self.get_height(y.right)) return y def get_height(self, root): if not root: return 0 return root.height def get_balance(self, root): if not root: return 0 return self.get_height(root.left) - self.get_height(root.right) ``` ### 数学证明中的 Rule 在数学证明中,rule 可能指的是公理化方法中的推理规则,这些规则定义了如何从已知的公理和定理推导出新的结论。例如,在形式化证明中,modus ponens 是一种常见的推理规则,它指出如果 $ P \rightarrow Q $ 成立,并且 $ P $ 也成立,则可以得出 $ Q $ 成立 [^3]。 ### 总结 Rule 在计算机科学中具有广泛的应用,无论是在形式语言、数据结构还是数学证明中,都扮演着至关重要的角色。它们提供了系统行为的基础框架,确保了逻辑的一致性和操作的有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值