초기화되지 않은 전역변수 컴파일시에 초기화 할수 있을까요?

gloomyr의 이미지

이전에 개발해놓은 소스를 사용할려고 합니다.

그런데 이전에 짜놓은 쏘스들은 전역변수들이 모조리 초기화 되지 않습니다.
그당시에는 전역변수는 초기화하지 않아도 0으로 초기화 된다는것이
보장되는지 알았습니다.

그런데 사용하다보니 예를들어 100개의 초기화되지 않는 전역변수가 있다면 1개정도는 0으로 초기화 되지 않고
쓰레기값이 들어가 잇는것입니다.
그래서 일일이 초기화를 해줘야 하는 상황이 왔습니다.

하지만 소스 규모가 좀있어서 초기화되지 않는 전역변수가
대략 좀 난감하게 많습니다. 여기저기 막 흩어져 있기도하고..

그래서 말입니다.!!
컴파일시에 초기화되지 않는 영역에 있는 전역변수들을 0으로 초기화 시키는
컴파일 옵션같은게 없나요!!??

조언좀 바랍니다.

시지프스의 이미지

초기화되지 않은 전역 변수는 bss 영역에 들어가고, 프로세스 시작 시 0으로 초기화된다고 알고 있습니다. 그리고 검색해 보니 C FAQ에도 초기화 된다고 나옵니다.

정확히 어떤 변수가 초기화되지 않나요? 그 변수의 선언이나 정의가 어떻게 되나요? 사용하시는 컴파일러, 운영체제, 하드웨어는 무엇인가요? 이런 점을 적어주시면 뭔가 더 알 수 있을지도 모르겠습니다.

begin{signature}
THIS IS SPARTA!!!!!n.
end{signature}

gloomyr의 이미지

운영체제 : linux Enterprise 5 server
컴파일러 : gcc 4.12

정확히 어떤변수가 초기화 안된다고 뭐라 말을 할수가 없어요
대략좀 많커던요 타입은
int,unsigned char 등등인데

지금 초기화 안된 변수는 int 타입입니다.
변수가 하나만있는게 아니라 좀 만이 있습니다.
전부다 초기화 안되는게 아니라
몇몇개만 안됩니다..

대략 변수가 천개정도가 있다고 하면
1,2개 정도..

그래서 상황이 이변수만 항상 초기화 안되는거라고 보장할수 없기에 나머지 변수들도
일일이 초기화 해줘야 하는 상황인데
그래서 일일이 찾아서 초기화 해주기 전에 컴파일 옵션에서 초기화 되지 않는 변수들
초기화 해주는 플래그가 없을까요

drinkme의 이미지

BSS의 zero fill은
libc의 C startup code에서 해 줍니다.
이 부분에 보면, BSS의 주소와 크기를 가져와서 소위 memset()해 주는 부분이 있죠.
이런저런 후에 이 code 가 main()을 호출합니다.

bushi의 이미지

"초기화되지 않은 전역 변수는 bss 영역에 들어가고" ... 이건 너무 요약되었습니다.

"초기값이 없는 놈들을 0으로 초기화한다" 가 C std 이고,
"O 으로 초기화 되는 것들을 .bss 로 집어넣자. 그러면 구지 0으로 초기화 할 필요가 없다." 는 gcc/binutils feature 입니다.
(제 기억에.. gcc 3.x 부터였습니다.)

-fno-zero-initialized-in-bss 옵션을 추가해서 컴파일해보고...
마찬가지 증상이라면 : 코드에 버그가 있던가, 컴파일러에 버그가 있던가
증상이 없어졌다면 : 로더에 버그가 있던가 OS 에 버그가 있던가

OTL

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.