Portál AbcLinuxu, 26. dubna 2024 07:27


Dotaz: C - konverze typu a kontrola

8.6.2009 10:07 jarda
C - konverze typu a kontrola
Přečteno: 615×
Odpovědět | Admin

Hezky den

mam toto v c:

#include <netinet/in.h>
#define short unsigned int UWORD

a nekde toto:

UWORD i = 1;
i = htons(i); //htons pracuje in/out jen s UWORD, resp uint16_t

a KDEVELOP stale hlasi:

warning: conversion to 'short unsigned int' from 'int' may alter its value

Jak utnout tipec tomuto hlaseni, a ne zrovna tim ze vypnu kontroly typu?

Predem diky

Jarda

 

 

Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.6.2009 10:52 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Odpovědět | | Sbalit | Link | Blokovat | Admin
Když je to potřeba, je možné použít přetypování, tj. před proměnnou, která se na dané místo typově nehodí, je třeba vložit správný typ v kulatých závorkách. Časté je to zejména u ukazatelů, zejména pak alokace paměti.

V tomto případě se mi ale nelíbí to makro, správně by druhý řádek měl začínat klíčovým slovem typedef.
8.6.2009 11:04 graviton
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Odpovědět | | Sbalit | Link | Blokovat | Admin
#define short unsigned int UWORD
to není tak docela dobře...
Neměl to být spíš typedef?
Nebo když už, tak aspoň #define UWORD short unsigned int
8.6.2009 13:25 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Navíc bych se vykašlal na unsigned short int a použil uint16_t.
In Ada the typical infinite loop would normally be terminated by detonation.
8.6.2009 13:27 jardaz
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

Sorry, ja se pri opisovani spletl, ma tam byt to co jste uvedl (viz nize), ale to problem neresi.

#define UWORD short unsigned int

rovnez to neresi ani toto:

i=(UWORD)htons((UWORD)i);

ci toto (ikdyz zrusim makro a i definuji jako uint16_t):

i=(uint16_t)htons((uint16_t)i);

 

8.6.2009 13:50 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Podle tohohle (část, kde cituje z manuálu gcc) je to spíš chybka u překladače.
i=(uint16_t)htons((uint16_t)i);
Ty přetypování bych rozhodně vyhodil, protože proměnné odpovídají hlavičce funkce a takhle se to jenom zatemní.
I am always ready to learn although I do not always like to be taught. (W. Churchill)
8.6.2009 16:10 jardaz
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

Ja si to taky myslel, ale radsi se zeptam, protoze nikde neni duvod pouzivat int. No a ta hlaska nedava vice info, zda je to vuci leve hodnote ci parametru funkce. Takze dle odkazu off -Wconversion.

8.6.2009 16:18 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Možná by nebylo od věci vyměnit překladač nebo prověřit situaci při ručním překladu jediného zdrojového souboru v příkazovém řádku.
8.6.2009 18:38 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Odpovědět | | Sbalit | Link | Blokovat | Admin

Asi to bude záviset na verzi gcc (nebo glibc). Právě jsem zkusil přesně ten původní kód:

#include <stdio.h>
#include <netinet/in.h>

#define UWORD short unsigned int

int main()
{
  UWORD i = 1;
  i = htons(i);
  printf("%hu\n", i);
  return 0;
}

a obešlo se to bez protestů i s '-Wall -Wextra'. Použil jsem gcc 4.3.2 a glibc 2.9.

8.6.2009 19:03 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Asi to bude záviset na verzi gcc (nebo glibc)
Vypadá to tak: gcc (GCC) 4.1.2 (Gentoo 4.1.2) řve, gcc (GCC) 4.4.0 20090526 (prerelease) je v pohodě.
I am always ready to learn although I do not always like to be taught. (W. Churchill)
Fuky avatar 8.6.2009 21:58 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

U mě neřve ani jedna verze gcc, glibc 2.7-18:

gcc-3.3 (GCC) 3.3.5 (Debian 1:3.3.5-13)
gcc-3.4 (GCC) 3.4.6 (Debian 3.4.6-9)
gcc-4.1 (GCC) 4.1.3 20080704 (prerelease) (Debian 4.1.2-25)
gcc-4.2 (GCC) 4.2.4 (Debian 4.2.4-6)
gcc-4.3 (Debian 4.3.2-1.1) 4.3.2

9.6.2009 09:30 jardaz | Opava
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

Hezky den

vsem diky ze se problemu venujete, tady davam info, kdy se to generuje na mem sw (stejny kod jak v prizpevku vyse):

  • KDevelop 3.5.4 pod KDE 3.5.10-3.fc10,
  • gcc version 4.3.2 20081105 (Red Hat 4.3.2-7),
  • FC10
  • a nastaveni překladače: -O0 -Werror-implicit-function-declaration -Wimplicit-int -Wuninitialized -Wconversion -Wmissing-declarations -pg -freg-struct-return -O -g3, 

tak to hlasi testwarning.c:16: warning: conversion to 'short unsigned int' from 'int' may alter its value. Vyradim-li prepinac -Wconversion, tak to hlaseni zmizi, na to vsak upozornil jiz v prispevku Vojtech Horky, takze pouziti tohoto prepinace je dvojsecne, sice oznaci mista, kde se pouzije implicitni pretypovani, ale oznaci varovanim i to kde jiste k pretypovani vubec nedochazi.

9.6.2009 10:07 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Zajímavé zjištění: samožné -Wconversion nestačí, ale když přidám optimalizaci, začne se ta hláška objevovat i u mne. Zřejmě to souvisí s tím, že ntohs() je definováno jinak při překladu s optimalizací a jinak bez ní. Ale teď bohužel nemám čas rozplétat všechny ty #ifdef-y v hlavičkových souborech.
9.6.2009 10:34 jardaz | Opava
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola

Ja se dival na ten hlavickovy soubor, jednoznacne zneho vyplyva, ze hto... funkce jsou tam ruzne definovany podle optimalizace a zpusobu uschovy udaju v pameti, prakticky lze rici, ze pri max. optimalizaci by stacilo misto funkce pouzit inline assembler a to operaci bswap x (x znaci nejaky ten parametr) a kdo vi jak se to pak jevi prekladaci. Chci jen podotknout, ze htons neni jedine misto, kde se ten prepinac a warning objevuje, vybral jsem ji zcela nahodne.

9.6.2009 10:47 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Příčina je zřejmě v této části netinet/in.h:
#ifdef __OPTIMIZE__
/* We can optimize calls to the conversion functions.  Either nothing has
   to be done or we are using directly the byte-swapping functions which
   often can be inlined.  */
# if __BYTE_ORDER == __BIG_ENDIAN
/* The host byte order is the same as network byte order,
   so these functions are all just identity.  */
# define ntohl(x)       (x)
# define ntohs(x)       (x)
# define htonl(x)       (x)
# define htons(x)       (x)
# else
#  if __BYTE_ORDER == __LITTLE_ENDIAN
#   define ntohl(x)     __bswap_32 (x)
#   define ntohs(x)     __bswap_16 (x)
#   define htonl(x)     __bswap_32 (x)
#   define htons(x)     __bswap_16 (x)
#  endif
# endif
#endif
Můj zkušební kód po gcc -E -O (Debian 4.3.3-7) dopadne takto:
int main() {
  unsigned short int w1, w2;
  w1 = 0x1234;
  w2 = (__extension__ ({
    register unsigned short int __v, __x = (w1);
    if (__builtin_constant_p (__x))
      __v = ((((__x) >> 8) & 0xff) | (((__x) & 0xff) << 8));
    else
      __asm__ ("rorw $8, %w0" : "=r" (__v) : "0" (__x) : "cc");
    __v;
  }));
  printf("%x\n", w2);
  return 0;
}
Přiřazení s w2 = … bylo původně w2 = ntohs(w1), při zapnutých optimalizacích tedy w2 = __bswap_16(w1). Rozvoj makra je v příspěvku vidět. Bitové operace v první větvi podmínky vyvolají onu hlášku. Kód se navíc vykoná jen tehdy, pokud je hodnota známá během překladu, pro proměnnou se použije vložený kus asembleru.
9.6.2009 11:23 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Kód se navíc vykoná jen tehdy, pokud je hodnota známá během překladu, pro proměnnou se použije vložený kus asembleru.

V podstatě máte pravdu, ale formulace "kód se vykoná" není přesná. To větvení je tam právě proto, že je-li argument konstanta, (neefektivní) výpočet podle vozorečku provede samotný překladač a do kódu jde rovnou výsledná konstanta (stejně jako když napíšete třeba int a = 1 + 1).

9.6.2009 11:26 #Tom | skóre: 32 | blog: Inspirace, aneb co jsem kde vyhrabal
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Díky za upřesnění.
9.6.2009 10:15 petris_ | skóre: 12
Rozbalit Rozbalit vše Re: C - konverze typu a kontrola
Odpovědět | | Sbalit | Link | Blokovat | Admin
includujte arpa/inet.h

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.