[#1] [C, VBCC] suspicious format string
Ciągle otrzymuję z kompilatora taki warning "suspicious format string" przy takich linijkach kodu:
sprintf(buffer, "%.*s", lsize, buffer);

i podobnych.
buffer
z tego przykładu mam zdefiniowany jako
char *
, a
lsize
jako
int
.
Wcześniej do
buffer
wczytuję treść pliku tekstowego otwartego w trybie
"r"
.
Dlaczego dla kompilatora VBCC ten string jest "suspicious"?
W sumie jest to tylko warning. Jak dotąd wszystko działa tak jak chcę i nic mi się nie zwiesiło, ale to jest denerwujące. Poza tym może mój program działa tylko przypadkiem :D i ten warning jest rzeczywiście uzasadniony?
[#2] Re: [C, VBCC] suspicious format string

@R-Tea, post #1

Wygląda, że jest w porządku, możliwe, że czepia się tego podwójnego buffer w tej instrukcji :)
[#3] Re: [C, VBCC] suspicious format string

@R-Tea, post #1

Ciężko powiedzieć, bo wygląda, jakby coś było rozwalone... Nie wiem,
albo Code nie dziala,albo jest zle uzyte....

[#4] Re: [C, VBCC] suspicious format string

@Kaczus, post #3

@ Kaczuś

"Code" ?
[#5] Re: [C, VBCC] suspicious format string

@R-Tea, post #4

No napisalem bez nawiasow kwadratowych, zeby bylo widac.

[#6] Re: [C, VBCC] suspicious format string

@R-Tea, post #1

hmm, wydaj mi się że jest błąd w twoim kodzie,
sprintf(buffer, [b]"%.*s"[/b], lsize, buffer);


Przecież oczekujesz stringa( char *) a masz wpisane lsize które jest intem jak powiedziałeś a dopiero później masz buffer i dlatego kopilator cosik tam podejrzewa że go chcesz w bambuko zrobić. W zasadzie to nie wiem po co jest ten lsize . Chyba powinno być tak.
sprintf( buffer, "%.*s", buffer );

Pozdrawiam

[#7] Re: [C, VBCC] suspicious format string

@Kaczus, post #5

@ Kaczuś
No napisalem bez nawiasow kwadratowych, zeby bylo widac.

hej, ale mnie chodzi o mój kod w C, a uwagi dotyczące taga "code" to proszę do grx'a zgłaszać :)

mam takie coś:
sprintf(buffer, "%.*s", lsize, buffer);

lsize to int
buffer to char*

VBCC ciągle mnie ostrzega, że to jest suspicious format string. Co jest źle?
[#8] Re: [C, VBCC] suspicious format string

@asman, post #6

@ asman

sprintf(buffer, "%.*s", lsize, buffer);

ta gwiazdka oznacza, że w tym miejscu będzie podany maksymalny rozmiar pola, w tym przypadku lsize.
Faktycznie, bez gwiazdki i lsize się nie czepia, ale to mnie nie ratuje, bo gdy nie określę maksymalnego rozmiaru pola to funkcja wypisująca teść na ekran czyta poza buforem i mam czasem syf na ekranie, a czasem zwieszki.

I jeszcze jedna dziwna rzecz, a mianowicie ta kropka przed gwiazdką. Nie wiem co ona robie (znalazłem taki przykład w internecie), ale bez tej kropki mam taki sam efekt jakbym w ogóle nie określił rozmiaru pola, czyli też przypadkowy syf i zwieszki.


[#9] Re: [C, VBCC] suspicious format string

@R-Tea, post #8

Pewny jestes, że jest to w standardzie? Moze jest to rozszerzenie
jakiegos kompilatora (tak jak %S w VC). Ja pierwszy raz widze taki
zapis a oczy. Nie twierdze, ze takiego nie ma, ale cos powatpiewam, by
bylo.

[#10] Re: [C, VBCC] suspicious format string

@R-Tea, post #7

Twój post jest spieprzony - tak wyglada:
http://kaczus.republika.pl/various_files/voy.png
jest nieczytelny!!!

[#11] Re: [C, VBCC] suspicious format string

@Kaczus, post #10

@ Kaczuś
wój post jest spieprzony

Wiem. Na IBrowse też tak wygląda.
[#12] Re: [C, VBCC] suspicious format string

@Kaczus, post #9

@ Kaczuś
Pewny jestes, że jest to w standardzie?

jest o tym w "Język ANSI C" Kerninghama, choć cokolwiek inaczej objaśnione:
"Specyfikacja przekształcenia steruje przekształceniem kolejnego pola wejściowego. Zwykle wynik jest przypisywany zmiennej wskazanej odpowiednim argumentem. Jeśli jednak przypisanie ma być wstrzymane, jak np. w %*s, do dane pole wejściowe będzie po prostu pominięte - nie wykona się żadne przypisanie"

niż to znalazłem w necie:
http://cplusplus.com/ref/cstdio/sprintf.html
tabelka width
[#13] Re: [C, VBCC] suspicious format string

@R-Tea, post #8

ta gwiazdka oznacza, że w tym miejscu będzie podany maksymalny rozmiar pola, w tym przypadku lsize.
Faktycznie, bez gwiazdki i lsize się nie czepia, ale to mnie nie ratuje, bo gdy nie określę maksymalnego rozmiaru pola to funkcja wypisująca teść na ekran czyta poza buforem i mam czasem syf na ekranie, a czasem zwieszki.


Faktycznie jest z tą gwiazdką tak jak mówisz określa rozmiar pola, ale bez tego czyta poza buforem, może potrzeba jakiegoś konkretnego końca , tylko nie wiem jakiego ( przeważnie w C jest nim zero, ale może w tym przypadku potrzeba EOF ). Moja propozycja jest taka, wywalić gwiazdkę i lsize a zaalokować troszkę więcej pamięci na buffer i dodać zero na końcu i sprawdzić albo dodać EOF na końcu i też sprawdzić . Powinno być dobrze.
A byłbym zapomniał dwa linki może będą pomocne
http://www.thinkage.ca/english/gcos/expl/c/lib/sprint.html
http://www.thinkage.ca/english/gcos/expl/c/lib/printf.html
Pozdrawiam



Ostatnia modyfikacja: 17.10.06 08:05
[#14] Re: [C, VBCC] suspicious format string

@asman, post #13

@ asman
Moja propozycja jest taka, wywalić gwiazdkę i lsize a zaalokować troszkę więcej pamięci na buffer i dodać zero na końcu i sprawdzić albo dodać EOF na końcu i też sprawdzić.

hmmm.. wg Kernighana i Ritchiego EOF jest typu int. Jak mam dokleić inta na koniec bufora tyou char* ?
Próbowałem strcat() ale wychodzą hocki klocki. Zresztą strcat() oczekuje const char* jako drugiego argumentu, a nie int.
Zajrzałem jeszcze do stdio.h i tam EOF jest zdefiniowany w ten sposób:
#define EOF (-1)
[#15] Re: [C, VBCC] suspicious format string

@R-Tea, post #14

W C są używane stringi konczone zerem, ze tak podpowiem....

[#16] Re: [C, VBCC] suspicious format string

@R-Tea, post #1

A jaki właściwie efekt chcesz uzyskać?
Z tego co widzę, to z tego samego do tego samego stringa chcesz skopiować nie więcej niż lsize znaków.

Ale przecież można prościej (i szybciej):
if(strlen(buffer)>lsize)
buffer[lsize] = 0;


Pamiętam, że kiedyś też mi się vbcc czepiał czegoś (ten sam komunikat), ale działało. No ale sam komunikat mówi, że to jest tylko 'podejrzane', może dlatego, że taka konstrukcja może być wynikiem pomyłki i kompilator przed nią ostrzega, tak samo jak przed:
if(a=b)
[#17] Re: [C, VBCC] suspicious format string

@R-Tea, post #14

I jak rozwiązałeś ten problem , bom zwyczajnie ciekawy ....
pozdrawiam

[#18] Re: [C, VBCC] suspicious format string

@asman, post #17

@ asman

Zwyczajnie. Zostawiłem tak jak miałem, czyli:
sprintf(buffer, "%.*s", lsize, buffer);
A warningiem się nie przejmuję, jeśli nic mi się nie sypie (jak dotąd). :)
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem