C言語単語

1371件
シーゲンゴ
3.1千文字の記事
  • 12
  • 0pt
掲示板へ

C言語とは、プログラミング言語の一つである。単にCとも呼ばれる。

概要

AT&T社のベル研究所でB言語の後継として、UNIX移植性を高めるために作られた。

Bの次はアルファベットでCなのでCと命名されたとも、B言語の元となったBCPLの2番文字を採って命名されたとも言われる。

元々UNIXを記述する的で内輪向けに作られた言語であるため、安全性はあまり考慮されていない。配列の添字チェックかったり、ポインタ効でもアクセスしようとしたり、整数ポインタ自由キャストできたり。やりたい放題

しかし、記述の制約がそれまでの言語よりも少なく、より簡易的な記述が可になったことや、GOTO文を排除した構造化プログラミングが容易に行えることから、1980年代より普及が進んでいった。

その後、C++JavaC#といったプログラミング言語PerlJavaScriptPHPなどのスクリプティング言語の仕様に大きなを与えた。

C言語に関する規格

C言語はプログラミング言語の中でも較的歴史が長く、何度か規格が改定されてきた。

K&R

K&Rとは、カーハンとリッチーの共著『The C Programming Language』(邦題:プログラミング言語C)のこと。転じて、標準化以前のC言語をす。K&Rは解説書であり規格書ではないため曖昧な記述も多く、これを元に作られたコンパイラ同士の非互換性を生むこととなった。

プログラミング言語を学ぶ人が一番最初に出会う事の多いプログラム、「Hello, World!」はこの本に由来する。

C89

ANSIが1989年に策定した規格。ANSI Cとも呼ばれる。これにより、初めてC言語の標準化が行われた。

C90

ISOISO/IEC 9899として1990年に策定した規格。内容はC89と同一。

C95

ISO1995年に策定した規格。C90際化のためワイド文字列関連のライブラリが追補として追加された。

C99

ISO1999年に策定した規格。複素数や可変長配列など、様々な機が追加された。

現在、一部を除いて一般的に用いられている規格。

C11

ISO2011年に策定した規格。スレッドUnicode対応など、またまた様々な機が追加された。それと、gets関数削除された

C17(C18とも)

ISO2018年に策定した規格。C11マイナーアップデート

C23

ISO2024年に策定した規格。C++との互換性がより高まるような変更が多く導入されている。

こんなところで使われているよ

主なコンパイラ

サンプルコード

Hello, World!

Cを学ぶ上で避けては通れないコード

#include <stdio.h>

int main(void) {
printf("Hello, World!");
return 0;
}

よくある勘違い

void main

C言語でのmain関数

定義するか、

のような同等の定義か、処理系依存定義をしなければならない。(C99 5.1.2.2.1)

よって、

は、C言語の規格上定義されていない。

また、return せずに main 関数の最後まで到達した場合、main 関数は 0 を返したことになる。int と互換性のの値を返した場合には不定となる。(C99 5.1.2.2.3)

よく気付かれるので、C言語の解説動画などでvoid main(void)にすると荒れる原因となる。

絶対に使ってはいけない関数

諸ヘッダファイル定義はされているもののその関数自体に重大なバグを抱えている関数がC言語には存在する。C言語プログラミングを学ぶ人のために、簡単にまとめておく(適宜追加してください)。

char *gets(char *s)

この関数は、標準ヘッダファイルstdio.hに宣言されており、 標準入力(stdin,普通キーボード入力が該当)から改行文字EOFまでの一行を受け取り、引数となるcharポインタ変数すバッファに格納する(末尾の改行文字'\n'やEOFは'\0'に置き換えられる)。

問題点は、例えば以下のような状況でバッファオーバーランを起こし、変な動作をする点である。

例えば、最初に変数として「char s[200];」を宣言し、「gets(s);」でキーボードから文字を入力することを考える。ここで、入力が改行記号を除いた199バイトより大きい場合、その余剰分のデータが分け与えられたメモリ領域とは別のところを書き込んでしまう。AAにするとこんな感じである(正確に言うと違うが、簡単に述べている)。

↓あるデータ     ↓s[200]      ↓あるデータ
0010001000][000000…0000][100010010010…

↓199バイトより大きい文字列をgetsで取得


↓あるデータ     ↓s[200]      ↓あるデータ
0010001000][1011101011][011010110010…

この右側の下線をつけたところが変に書き込まれたされたところである。ここに、たまたまウィンドウで開いてたお宝画像のデータがあったとしたら…?そのデータは壊れて変な画像になったり、開けなくなってゴミと化すかもしれない。また、ここにOSの重要なプログラムが入っていたとしたら…?PCの動作が不安定になるのは明らかである。

ここではデータ破壊の可性について論じたが、これがセキュリティホールの原因ではない。
たぶんs[200]の後には何らかの戻りアドレスが入っている確率が高い。そこで、sに「200バイトのダミーデータ」+「ニセの戻りアドレス」+「侵入用プログラム」と書くと、プログラムの送り込みと起動が1回の動作で実行できることになる。

対策は、fgets(s,sizeof(s),stdin)を使うこと。これも定された数以上に入力があったらプログラムの動作がおかしくなる場合があるが、少なくとも大事なデータを書き換えたり、こんな簡単にシステムに侵入されることはない。

getsはあまりにダメダメすぎる存在だったので、最新の標準規格C11削除された。

関連動画

関連リンク

関連項目

関連記事

親記事

子記事

  • なし

兄弟記事

【スポンサーリンク】

  • 12
  • 0pt
記事編集 編集履歴を閲覧

ニコニ広告で宣伝された記事

この記事の掲示板に最近描かれたお絵カキコ

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

C言語

152 ななしのよっしん
2020/12/17(木) 19:49:04 ID: Y5PnBUFDHE
自動変数の書き込みオーバーランバグリターンアドレスがぶち壊されたとか、ヌル文字文の領域確保しない馬鹿のせいで不定値がゼロかどうかに依存する神出暴走が起きたとか、そういうのを技術系じゃない上にわかる報告書にするのがとにかくめんどい
👍
高評価
0
👎
低評価
0
153 ななしのよっしん
2021/05/03(月) 02:04:10 ID: ZOzT1r4VMs
複雑というよりハードウェアの仕組みに沿った仕様になってる(ポインタとか)からハードウェアコンピュータアーキテクチャ)の知識がないと理解しにくい。逆にコンピュータアーキテクチャ, 特にCPURAMを理解していれば一発で理解できる。
👍
高評価
0
👎
低評価
0
154 ななしのよっしん
2021/09/12(日) 11:24:26 ID: Orp85TEfNn
「このコードには問題はないはずだよ。だって今動いてるし。めっちゃ使われてるし。問題があるならとっくに破綻してるよ」

他のプログラミング言語では至極っ当な思想なんだが、Cをやるなら不定値の恐ろしさは知ってほしいまじで
👍
高評価
0
👎
低評価
0
155 ななしのよっしん
2021/09/12(日) 18:56:26 ID: x8JAan+vJg
OS上で動かす限りポインタって言っても仮想アドレスなんだし言うほどハードウェアの仕組みに沿ってるか?
Cの怖さはから悪魔だと思うが
ああでもマルチスレッドとか考えるとメモリバリアの知識とか必要か
👍
高評価
0
👎
低評価
0
156 ななしのよっしん
2021/09/13(月) 07:17:03 ID: Orp85TEfNn
どこにでも あると思うな メモリ保護
👍
高評価
0
👎
低評価
0
157 ななしのよっしん
2021/12/13(月) 09:28:41 ID: I2T60nKYZm
実行中マジから悪魔が出てきたことがあってビビった
コンゴトモヨロシク
👍
高評価
1
👎
低評価
0
158 ななしのよっしん
2022/02/27(日) 10:26:39 ID: S01Z1DFLIi
>>149
いや、そんな脆弱性とか気にしなきゃいけないクソシステム構築が先に消える
👍
高評価
0
👎
低評価
0
159 ななしのよっしん
2022/06/27(月) 03:50:03 ID: HcE6/n0rO9
関連商品にある独習Cは業界ではBullschildtと呼ばれるつきの悪書. よくこれを訳そうと思ったもんだ.
👍
高評価
0
👎
低評価
0
160 ななしのよっしん
2022/10/08(土) 17:35:07 ID: hdeAS8hZw4
その53 C言語を使ったことがない人がびっくりしそうなC言語の特徴
22,824 回視聴2022/10/01
satlinuxtube
チャンネル登録者数 5640人
https://www.youtube.com/watch?v=nTHqvKnCyLcexit
👍
高評価
0
👎
低評価
0
161 ななしのよっしん
2022/10/14(金) 14:08:23 ID: JoDsUU2H5R
達人でもたまーにミスって脆弱性作って騒ぎをおこすほどヤバい言語なのに、いわんや初心者をや
👍
高評価
0
👎
低評価
0